2013-06-14 12 views
5

có một hướng dẫn mà thực sự làm việc cho nền tảng Windows 8 với XAML và C#: http://www.tech-recipes.com/rx/1954/get_web_page_contents_in_code_with_csharp/Windows 8 C# - lấy một nguồn trang web dưới dạng chuỗi

Đây là cách:

HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URL); 
myRequest.Method = "GET"; 
WebResponse myResponse = myRequest.GetResponse(); 
StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8); 
string result = sr.ReadToEnd(); 
sr.Close(); 
myResponse.Close(); 

Tuy nhiên trong Windows 8, người cuối cùng 2 dòng là mã để đóng kết nối (tôi giả định), phát hiện lỗi. Nó hoạt động tốt mà không đóng kết nối, tuy nhiên, nhưng tỷ lệ cược là gì? Tại sao chúng ta phải đóng kết nối? Điều gì có thể đi sai nếu tôi không? "Đóng kết nối" có nghĩa là gì?

+0

Lỗi nào bạn nhận được? – ZorleQ

+0

không phải là lỗi thời gian chạy, có lỗi khi tôi chỉnh sửa: 'System.IO.SystemReader' không chứa định nghĩa cho 'Đóng' và không có phương pháp mở rộng 'Đóng' blablabla –

+0

Phiên bản .NET nào bạn đã cài đặt ? Nó có thể không phải là cửa sổ 8 nhưng có thể là phiên bản .NET. – webnoob

Trả lời

3

Nếu bạn đang phát triển cho Windows 8, bạn nên cân nhắc việc sử dụng các phương thức không đồng bộ để cung cấp trải nghiệm người dùng tốt hơn và đó là tiêu chuẩn mới được đề xuất. Mã của bạn sau đó sẽ như thế nào:

public async Task<string> MakeWebRequest(string url) 
{ 
    HttpClient http = new System.Net.Http.HttpClient(); 
    HttpResponseMessage response = await http.GetAsync(url); 
    return await response.Content.ReadAsStringAsync(); 
} 
+0

Đơn giản và hiệu quả. Cảm ơn. –

0

Có thể họ đã không dùng nữa close() trong API mới nhất. Điều này sẽ làm việc:

HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URL); 
myRequest.Method = "GET"; 

using(WebResponse myResponse = myRequest.GetResponse()) 
{ 
    using(StreamReader sr = new StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8)) 
    { 
     string result = sr.ReadToEnd(); 
    } 
} 

Lệnh using sẽ tự động xử lý đối tượng của bạn.

Để làm nổi bật comment webnoob của:

Chỉ cần chỉ ra (để tham khảo OP), bạn chỉ có thể sử dụng sử dụng trên lớp mà thực hiện IDisposable (mà trong trường hợp này là tốt)

+0

Chỉ cần chỉ ra (đối với tham chiếu OP), bạn chỉ có thể sử dụng 'using' trên các lớp thực hiện IDisposable (trong trường hợp này là tốt). – webnoob

+0

Hoàn toàn chính xác. – ZorleQ

0
using System.Net; 
using System.Net.Http; 

var httpClient = new HttpClient(); 
var message = new HttpRequestMessage(HttpMethod.Get, targetURL); 
//message.Headers.Add(....); 
//message.Headers.Add(....); 

var response = await httpClient.SendAsync(message); 
if (response.StatusCode == HttpStatusCode.OK) 
{ 
    //HTTP 200 OK 
    var requestResultString = await response.Content.ReadAsStringAsync(); 
}