2011-01-15 29 views
20

Tôi cần phát hành khoảng 50 yêu cầu HTTP cho một máy chủ (cuộc gọi API). Hiệu suất là quan trọng, vì vậy tôi muốn sử dụng HTTP KeepAlive's. WebClient có hỗ trợ điều này không?WebClient có sử dụng KeepAlive không?

Trả lời

17

Máy in trên máy của tôi, nhưng tôi không thể thấy rằng đó là được ghi thành tài liệu. Tôi chắc chắn sẽ mong đợi nó theo mặc định. Cách đơn giản nhất để nói là chạy Wireshark (hoặc Fiddler) và xem chính xác những gì đang đi xuống dây.

Ví dụ, chương trình này:

using System; 
using System.Net; 

class Test 
{  
    static void Main() 
    { 
     WebClient client = new WebClient(); 
     for (int i = 0; i < 50; i++) 
     { 
      string text = client.DownloadString("http://www.microsoft.com"); 
      Console.WriteLine(text.Length); 
     } 
    } 
} 

Tạo một yêu cầu đầu tiên của:

GET/HTTP/1.1 
Host: www.microsoft.com  
Connection: Keep-Alive 

yêu cầu dãy chỉ:

GET/HTTP/1.1 
Host: www.microsoft.com 

... có lẽ bởi vì một khi kết nối một đang ở chế độ KeepAlive, nó giả định nó sẽ vẫn như vậy.

+0

Tôi đã nhận thấy một số hành vi kỳ lạ khi sử dụng UploadData, vì một số lý do mà tiêu đề của khách hàng được đặt lại khi trả về byte. – Oliver

+0

@Oliver: Nó không thực sự rõ ràng những gì bạn có nghĩa là do đó, nhưng nếu đó là một cái gì đó gây ra cho bạn vấn đề, bạn có thể muốn hỏi một câu hỏi mới. –

+0

Nó không thực sự là một vấn đề chỉ nghĩ rằng tôi muốn đặt một lưu ý về một số hành vi tôi đã nhìn thấy. Hành vi như sau Tạo WebClient -> Thêm Tiêu đề vào Từ điển -> Thực hiện cuộc gọi UploadData -> Tiêu đề sẽ trống, có vẻ như chúng bị nuked vì một lý do nào đó. – Oliver

14

Như được nêu ở đây, WebClient sử dụng WebRequest trong việc triển khai riêng tư, http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx. Microsoft không cho rằng đó là tài sản công cộng để bạn kiểm soát.

Do đó, hãy xem xét việc triển khai bằng cách sử dụng Trình phản xạ, bạn có thể xem cách KeepAlive được đặt cho đối tượng WebRequest đang sử dụng. Giống như @Jon đã chỉ ra, một thử nghiệm cho thấy rằng KeepAlive được đặt thành true. Điều này cũng phù hợp với các kịch bản khác, chẳng hạn như thực hiện riêng tư từ xa .NET.

Trong trường hợp hiếm hoi, bạn có thể tìm thấy KeepAlive = true có thể dẫn đến SocketException, và sau đó bạn phải sử dụng sự phản chiếu hoặc các thủ thuật khác để đặt sai thành rất khó chịu.

+15

Bạn không cần phải sử dụng sự phản chiếu, bạn chỉ có thể kế thừa, ghi đè GetWebRequest() và đặt một số thuộc tính trên WebRequest sau khi gọi base.GetWebRequest() theo phương thức được ghi đè –

+1

Vâng, đó là cách tốt hơn. –

+1

https://msdn.microsoft.com/en-us/library/system.net.webclient.getwebrequest.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2 – Ginkgo

Các vấn đề liên quan