2010-02-11 17 views
10

Tôi đã tự hỏi nếu bạn có thể giúp tôi với một lỗi tôi có. Tôi có một Trình quản lý HTTP mà tôi đã tạo để giúp tôi xử lý dữ liệu POSTING/GETing từ các trang web. Nó đã làm việc tốt cho đến gần đây khi tôi đang cố gắng sử dụng một hỗn hợp của cả hai. Vòng lặp đầu tiên tất cả mọi thứ hoạt động, trên vòng lặp thứ hai nó treo trên HttpWebRequest.GetRequestStream(). Tôi đã đọc trên mạng và không tìm thấy giải pháp thực sự nào. Dưới đây là những CodeBlocks cho quyến rũ/nhận:Có ai biết tại sao tôi nhận được một HttpWebRequest Timeout?

ASCIIEncoding encoding = new ASCIIEncoding(); 
byte[] buffer = encoding.GetBytes(_PostData); 

_HttpWebRequest = (HttpWebRequest)WebRequest.Create(_FetchUrl); 
_HttpWebRequest.Credentials = _Credentials; 
_HttpWebRequest.Method = _RequestType.ToString(); 
_HttpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
_HttpWebRequest.ContentLength = buffer.Length; 
_HttpWebRequest.UserAgent = userAgent; 
_HttpWebRequest.CookieContainer = _CookieContainer; 
_HttpWebRequest.KeepAlive = false; 
_HttpWebRequest.AllowAutoRedirect = _AllowAutoRedirect; 
_HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip; 
_HttpWebRequest.ServicePoint.Expect100Continue = false; 

if (_RequestType.Equals(RequestTypes.POST)) 
{ 
    // Write POST 
Stream reqStream = _HttpWebRequest.GetRequestStream(); 
{ 
    reqStream.Write(buffer, 0, buffer.Length); 
    reqStream.Flush(); 
    reqStream.Close(); 
    } 
} 

Và phản ứng:

HttpWebResponse httpWebResponse = (HttpWebResponse)_HttpWebRequest.GetResponse(); 
{ 
    Stream responseStream = httpWebResponse.GetResponseStream(); 
    { 
    if (_UseGzip) 
    { 
     if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip")) 
     { 
     responseStream = new GZipStream(responseStream, CompressionMode.Decompress); 
     } 
     else 
     { 
     responseStream = new DeflateStream(responseStream, CompressionMode.Decompress); 
     } 
    } 

    if (responseStream != null) 
    { 
     StreamReader streamReader = new StreamReader(responseStream); 
     { 
     try 
     { 
      _PageContent = streamReader.ReadToEnd(); 
     } 
     finally 
     { 
      streamReader.Close(); 
      responseStream.Close(); 
      httpWebResponse.Close(); 
     } 
     } 
    } 
    else 
    { 
     _PageContent = string.Empty; 
    } 
    } 
} 
_HttpWebRequest.Abort(); 

bất cứ ai có thể nhìn thấy bất kỳ sai sót tại sao mã của tôi được treo? Tất cả các luồng đang bị đóng, tôi đã thiết lập các kết nối được cho phép trên 100, tôi không hiểu tại sao điều này lại xảy ra.

+0

Các bạn đã cố gắng sử dụng một cái gì đó giống như Wireshark để xem những gì dữ liệu được thực sự được gửi đi? – Foole

+0

Khi bạn nói rằng mã hoạt động lần đầu tiên nhưng dừng lại ở lần thứ hai, bạn sử dụng phương pháp http nào trong các yêu cầu tương ứng? –

+0

Mã treo trên một bài đăng, GET có vẻ hoạt động tốt. Khi tôi chạy mã thông qua proxy burp nó hoạt động tốt cho một số lý do? Có lẽ proxy đang sửa chữa một số tiêu đề của tôi bởi vì tôi không hiểu nó sẽ tạo nên sự khác biệt như thế nào. –

Trả lời

11

Đây có thể là do thực tế rằng bạn không vứt bỏ WebResponse hoặc suối hoặc StreamReaders:

var request = WebRequest.Create(...); 
using (var response = request.GetResponse()) 
{ 
    using (var responseStream = response.GetResponseStream()) 
    { 
     using (var reader = new StreamReader(responseStream)) 
     { 
      // use the reader 
     } 
    } 
} 
+0

Tôi đang hủy yêu cầu (không có phương thức vứt bỏ) và đóng tất cả các luồng có sẵn. Tôi cũng đã cố gắng thiết lập tất cả các đối tượng để null và sau đó gọi GC ở cuối mỗi yêu cầu để xử lý chúng và điều này cũng không có ảnh hưởng. –

+2

@Paul: bạn cũng cần phải vứt bỏ 'StreamReader', vì nó thực hiện' IDisposable'. Tương tự với 'Stream', mà bạn không đóng nếu một ngoại lệ được ném ra. Đó là những gì khối 'using' làm cho bạn. Nó đảm bảo rằng tham số của nó được Disposed, không có vấn đề gì. Ngay sau khi tôi nghe nói rằng bạn mã không thành công trên các nỗ lực tiếp theo, tôi tự hỏi, "anh ấy đã làm gì trên _previous_". Rất thường xuyên, câu trả lời là, "một cái gì đó đã không nhận được Dispose'd". –

2

tôi đã cùng một vấn đề. Tôi đã đóng (xử lý) tất cả các luồng và HttpWebResponse một cách chính xác bằng các khối này. Vấn đề vẫn tồn tại khi tôi gửi spam các yêu cầu bị hủy bỏ bởi ThreadAbortExceptions. Cuối cùng nó đã giúp gọi myWebRequest.Abort() khi ThreadAbortException xảy ra! Hi vọng điêu nay co ich.

0

Tôi thấy rằng bạn sử dụng:

HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip; 

Cùng với cách tiếp cận giải nén thủ công:

 if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip")) 
     { 
     responseStream = new GZipStream(responseStream, CompressionMode.Decompress); 
     } 
     else 
     { 
     responseStream = new DeflateStream(responseStream, CompressionMode.Decompress); 
     } 

Chưa thử nếu nó thực sự quan trọng, nhưng tôi chỉ sử dụng phương pháp thủ công và trong mã tương tự, và nó hoạt động tốt. Trên thực tế tôi có treo vấn đề, nhưng chỉ với một tên miền, thử nghiệm với các tài sản cho thấy sự khác biệt.

Oh, và tôi nghi ngờ nếu bạn không sử dụng bất kỳ nén bài dữ liệu, bạn cần phải loại bỏ tiêu đề mã hóa nội dung

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