2010-02-01 33 views
19

Tôi có thể sử dụng lại HttpWebRequest không?Tôi có thể sử dụng lại HttpWebRequest không?

Dường như yêu cầu thứ 3 đến một trang web khiến cho hoạt động mất thời gian. Dường như mỗi yêu cầu tạo một kết nối mới, vì vậy tôi muốn biết liệu tôi có thể sử dụng lại HttpWebRequest bằng cách thay đổi url và nhận lại yêu cầu không. Mã được đề cập bên dưới. Mã này kiểm tra nếu một loạt các url tồn tại.

static void storeList(TextWriter sw, string urlTemplate, int start, int end) 
    { 
     for (int i = start; i < end; i++) 
     { 
      var url = string.Format(urlTemplate, i); 
      var req = (HttpWebRequest)HttpWebRequest.Create(url); 
      { 
       req.Method = "HEAD"; 
       tryHttpWebRequest 
       { 
        var resp = req.GetResponse(); 
        sw.WriteLine(i); 
       } 
       catch (Exception e) 
       { 
       } 
      } 
     } 
     sw.Flush(); 
    } 
+1

Bạn không sử dụng lại 'HttpWebRequest' trong mã ví dụ của mình - bạn tạo một mã mới mỗi lần quanh vòng lặp' for'. – adrianbanks

+0

Tôi biết, do đó, câu hỏi, làm thế nào để tôi tái sử dụng? ;) –

+0

Ah, ok. Tôi mặc dù bạn đang cố gắng cho thấy rằng bạn đang sử dụng lại yêu cầu nhưng nó không hoạt động. – adrianbanks

Trả lời

13

Bạn sẽ ổn nếu bạn chỉ cần gọi Đóng trên phản hồi của bạn. Bạn chỉ được cho phép nhiều kết nối "mở", vì vậy lý do nó không thành công vì nó không thể mở một kết nối mới.

Khi bạn đã hoàn tất phản hồi, bạn cần đóng lại ... không cần phải sử dụng lại bất cứ thứ gì.

Từ MSDN article:

Bạn phải gọi một trong hai Stream.Close hoặc phương pháp HttpWebResponse.Close để đóng phản ứng và giải phóng kết nối để tái sử dụng. Nó không phải là cần thiết để gọi cả hai Stream.Close và HttpWebResponse.Close, nhưng làm do đó không gây ra lỗi.

+5

@acid & josh - ý nghĩa của bài đăng này là nếu phản hồi được trả về từ (Bắt đầu) GetResponse có thể bị đóng và yêu cầu có thể được sử dụng lại nhưng các thử nghiệm không hỗ trợ điều này. Nếu bạn có thể đăng một số mã để làm rõ chính xác câu hỏi bạn đang trả lời sẽ là tuyệt vời. –

2

Chỉ cần tạo tài khoản mới. Tôi sẽ không lo lắng về việc có hiệu quả trong kịch bản này, như môi trường .NET + HTTP keepalives nên xử lý mọi thứ cho bạn từ quan điểm đó tôi tin.

Có thể bạn đang chạy vào 1) một vấn đề với số lượng kết nối mở; giết kết nối và lỗi sẽ biến mất hoặc 2) một vấn đề với giới hạn số lượng yêu cầu mỗi giây trên máy chủ (công cụ chống DoS). Tôi sẽ thử # 1 đầu tiên, vì nó đơn giản hơn, và sau đó nếu bạn vẫn thấy vấn đề, hãy kiểm tra xem máy chủ có nhận được yêu cầu hay không nhưng từ chối nó.

2

Quấn gọi phản ứng của bạn trong một tuyên bố sử dụng để đảm bảo rằng kết nối được luôn đóng:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url) 
// ... 
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
    // ... 
} 

Cũng quấn bất kỳ GetResponseStream() trong một tuyên bố sử dụng.

+0

Phản hồi IIRC không có IDispose. Tôi đã thử trước khi đăng câu hỏi. Giải pháp được sử dụng .đóng vào cuối mỗi vòng lặp –

+0

@ acidzombie24, 'HttpWebResponse: WebResponse: IDisposable', [và đã thực hiện từ .NET 1.1] (https://msdn.microsoft.com/en-us/library/ system.net.webresponse% 28v = vs.71% 29.aspx). –

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