2009-09-03 35 views
7

ứng dụng asp.net của tôi gửi HttpWebRequest đến máy chủ REST của từ xa và chờ đợi câu trả lời, và tôi thấy có rất nhiều thông báo lỗi tương tự như thế này:Làm thế nào để đóng kết nối cơ bản sau thời gian chờ HttpWebRequest bắt

System. Net.WebException: Thao tác đã hết thời gian chờ. tại System.Net.HttpWebRequest.GetResponse()

Có thể sau khi tôi bắt ngoại lệ này và đóng kết nối http cơ bản trực tiếp? hoặc tôi không thực sự phải làm như vậy kể từ khi tôi đã đặt keepalive để sai?

Cảm ơn.

Trên thực tế, một câu hỏi khác là nếu ngoại lệ hết thời gian luôn xảy ra tại System.Net.HttpWebRequest.GetResponse(), có nghĩa là ứng dụng đang chờ phản hồi từ máy chủ từ xa và không thể nhận phản hồi cho đến khi hết giờ. những gì có thể là lý do có thể, kết nối mạng không ổn định? máy chủ từ xa không phản hồi? bất kỳ lý do nào khác có thể?

Đây là mã:

System.Net.HttpWebResponse httpWebResponse = null; 
System.IO.Stream stream = null; 
XmlTextReader xmlTextReader = null; 
try 
{ 
    System.Net.HttpWebRequest httpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(request); 
    httpWebRequest.ReadWriteTimeout = 10000; 
    httpWebRequest.Timeout = 10000; 
    httpWebRequest.KeepAlive = false; 
    httpWebRequest.Method = "GET"; 
    httpWebResponse = (System.Net.HttpWebResponse)httpWebRequest.GetResponse(); 
    stream = httpWebResponse.GetResponseStream(); 
    xmlTextReader = new XmlTextReader(stream); 
    xmlTextReader.Read(); 
    xmlDocument.Load(xmlTextReader); 
    //Document processing code. 
    //... 
} 
catch 
{ 
    //Catch blcok with error handle 
} 
finally 
{ 
    if (xmlTextReader != null) 
     xmlTextReader.Close(); 
    if (httpWebResponse != null) 
     httpWebResponse.Close(); 
    if (stream != null) 
     stream.Close(); 
} 
+0

bạn đã tìm giải pháp? Tôi đang chiến đấu cùng một vấn đề. Tôi không có ý kiến. –

+0

@AlekseyBykov bạn đã nói, câu trả lời được đánh dấu là không giải quyết được vấn đề của bạn? lựa chọn thay thế? – Kiquenet

Trả lời

2

Các đơn giản quy tắc-of-thumb là nếu nó không thực hiện IDisposal sau đó nó không cần xử lý.

+0

không thực hiện IDisposal, nhưng tôi thấy có nhiều kết nối trong điều kiện CLOSE_WAIT, không chắc chắn những gì đã xảy ra, lo lắng về việc nếu mã của tôi không xử lý các kết nối cơ bản đúng cách. – machinegone

+0

Tôi nghĩ rằng bạn phải tin tưởng các nhà thiết kế khung về điều này. Xem http://stackoverflow.com/questions/716436/is-there-a-correct-way-to-dispose-of-a-httpwebrequest để biết thêm thông tin. –

+2

mặc dù nói chung nó đúng sự thật nó không giải quyết vấn đề này –

0

Đảm bảo vứt bỏ cũng như đóng.

Hoặc sử dụng sử dụng khối thay vì thử-cuối cùng:

using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse()) { 
    using (var stream = httpWebResponse.GetResponseStream()) { 
     using (var xmlTextReader = new XmlTextReader(stream)) { 
      xmlDocument.Load(xmlTextReader); 
     } 
    } 
} 
+2

xử lý đối tượng phản ứng không giải quyết được vấn đề –

0

Một điều khác mà bạn có thể làm là gọi phương thức Abort() trên một HttpWebRequest mà đã dẫn đến một lỗi, như vậy :

catch (WebException we) 
{ 
    using (HttpWebResponse errorResp = we.Response as HttpWebResponse) 
    { 
    ... 
    } 
    request.Abort(); 
} 
+1

không giải quyết được vấn đề –

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