2010-06-04 50 views
8

Tôi cần gửi khoảng 200 yêu cầu HTTP song song với các máy chủ khác nhau và nhận phản hồi. Tôi sử dụng lớp HttpWebRequest trong C#. Nhưng tôi không thấy tăng cường thời gian tốt khi các yêu cầu được xử lý song song. Ví dụ nếu một yêu cầu cần 3 giây để nhận phản hồi, 2 yêu cầu song song - 6ec, 3 yêu cầu - 8 giây, 4 yêu cầu - 11 giây ... Không tốt, tôi hy vọng rằng sẽ có thời gian tốt nhất, khoảng 10 giây cho 200 yêu cầu. Dường như chỉ có 2-3 yêu cầu thực hiện song song, nhưng thời gian chờ bắt đầu ngay lập tức sau khi tạo đối tượng WebRequest. Tôi đã thử đặt các giá trị DefaultConnectionLimitMaxServicePoints nhưng id không được trợ giúp. Khi tôi hiểu các thông số này cho số yêu cầu đến một trang web song song. Tôi cần các yêu cầu đến các trang web khác nhau.Nhiều yêu cầu HTTP trong C#

Mã ví dụ mà tôi sử dụng để kiểm tra:

ArrayList a = new ArrayList(150); 

for (i = 50; i < 250; i++) 
{ 
    a.Add("http://207.242.7." + i.ToString() + "/"); 
} 

for (i = 0; i < a.Count; i++) 
{ 
    Thread t = new Thread(new ParameterizedThreadStart(performRequest)); 
    t.Start(a[i]); 
} 


static void performRequest(object ip) 
{ 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create((stirng)ip); 

     HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 
} 

Сan ai đã từng gặp phải một vấn đề như vậy? Cảm ơn bạn đã đề xuất.

+0

Tôi có vấn đề tương tự bản thân mình, có vẻ như WebRequest.Create() tái sử dụng cùng một kết nối TCP vì một lý do nào đó. Tôi tự hỏi nếu bạn phát hiện ra câu trả lời cho câu hỏi của bạn là gì? – ala

Trả lời

3

Thay vì khởi động đề của riêng bạn thử sử dụng các phương pháp không đồng bộ của HttpWebRequest như HttpWebRequest.BeginGetResponseHttpWebRequest.BeginGetRequestStream.

+1

Tôi đã có ứng dụng đa luồng và cần phải thực hiện yêu cầu này trong các chủ đề đã được xử lý. Đây chỉ là mã ví dụ. Điểm là khi chủ đề peforms WebRequest.Create và GetResponse hành động porfomance là rất rất chậm. Ngoài ra trước khi yêu cầu HTTP tôi thực hiện kết nối TCP trong cùng một chủ đề trên cổng 80 của sever để biết cổng được mở hoặc đóng và nó hoạt động rất nhanh. – Nikita

2

này có thể giúp - http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/1f863f20-09f9-49a5-8eee-17a89b591007

Gợi ý có một giới hạn về số lượng kết nối TCP cho phép, nhưng mà bạn có thể tăng giới hạn

+0

Thông tin chi tiết tại đây - http://arnosoftwaredev.blogspot.com/2006/09/net-20-httpwebrequestkeepalive-and.html Đây gần như chắc chắn là vấn đề bạn đánh trúng – ChoccyButton

+0

Mặc dù ..các liên kết của bạn dường như tham chiếu các kết nối đồng thời với * một * máy chủ, và từ ví dụ trong câu hỏi, OP đang tạo kết nối tới nhiều máy chủ khác nhau ... Đây có phải là trường hợp .NET không có giới hạn kết nối tối đa * bất kỳ * nào máy chủ lưu trữ là tốt? – Patrick

+0

@Patrick Hãy suy nghĩ bạn có một điểm. Phụ thuộc tôi đoán nếu tất cả 200 yêu cầu của anh ta đi đến các máy chủ khác nhau hoặc nói 10 đến máy chủ đầu tiên, 20 đến tiếp theo, 5 đến tiếp theo, v.v. Điều này sẽ gây ra vấn đề. Nếu không, nó có thể không phải là vấn đề. Đáng để thử ít nhất – ChoccyButton

0


bạn có thể thử này:

try 
     { 
      List<Uri> uris = new List<Uri>(); 
      uris.Add(new Uri("http://www.google.fr")); 
      uris.Add(new Uri("http://www.bing.com")); 

      Parallel.ForEach(uris, u => 
      { 
       WebRequest webR = HttpWebRequest.Create(u); 
       HttpWebResponse webResponse = webR.GetResponse() as HttpWebResponse; 
      }); 
     } 
     catch (AggregateException exc) 
     { 
      exc.InnerExceptions.ToList().ForEach(e => 
       { 
        Console.WriteLine(e.Message); 
       }); 
     } 
-2

Đây là mã ứng dụng Android của yêu cầu gửi. Làm thế nào chúng ta có thể sử dụng mã thượng như params.add (mới BasicNameValuePair ("key", "giá trị");

HttpPost yêu cầu = new HttpPost();

Danh sách params = new ArrayList();

params.add (BasicNameValuePair mới ("key", "giá trị"); // Làm thế nào chúng ta có thể cung cấp cho các giá trị trong định dạng này dạng

post.setEntity (UrlEncodedFormEntity mới (params));

httpClient.execute (yêu cầu);