2014-11-30 25 views
16

Tôi có một câu hỏi thực sự đơn giản. Tôi đang tải tệp lên máy chủ bằng cách sử dụng HTTP POST. Vấn đề là tôi cần phải đặc biệt xử lý thời gian chờ kết nối và thêm một chút của một thuật toán chờ đợi sau khi một thời gian chờ đã xảy ra để sống lại máy chủ.Xử lý thời gian chờ HttpWebRequest

Mã của tôi là khá đơn giản:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("SomeURI"); 
request.Method = "POST"; 
request.ContentType = "application/octet-stream"; 
request.KeepAlive = true; 
request.Accept = "*/*"; 
request.Timeout = 300000; 
request.AllowWriteStreamBuffering = false; 

try 
{ 
     using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
     { 
      WebHeaderCollection headers = response.Headers;  
      using (Stream Answer = response.GetResponseStream()) 
      { 
       // Handle. 
      } 
     } 
} 
catch (WebException e) 
{ 
    if (Timeout_exception) 
    { 
     //Handle timeout exception 
    } 
} 

tôi bỏ qua các tập tin đọc mã như nó không phải là mối quan tâm của chúng tôi. Bây giờ tôi cần phải chắc chắn rằng một khi một WebException được ném, tôi lọc ngoại lệ để xem nếu nó thực sự là một ngoại lệ timeout. Tôi nghĩ về việc so sánh với thông điệp ngoại lệ nhưng tôi không chắc liệu đây có phải là cách đúng đắn vì ứng dụng được đề cập là một ứng dụng thương mại và tôi sợ rằng thông điệp khác nhau giữa các ngôn ngữ khác nhau. Và tôi nên tìm thông điệp gì.

Mọi đề xuất?

Trả lời

27

Bạn có thể nhìn vào WebException.Status. Các WebExceptionStatus enum có một lá cờ Timeout:

try 
{ 
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
    { 
     WebHeaderCollection headers = response.Headers;  
     using (Stream answer = response.GetResponseStream()) 
     { 
      // Do stuff 
     } 
    } 
} 
catch (WebException e) 
{ 
    if (e.Status == WebExceptionStatus.Timeout) 
    { 
     // Handle timeout exception 
    } 
    else throw; 
} 

Sử dụng C# 6 bộ lọc ngoại lệ có thể có ích ở đây:

try 
{ 
    var request = WebRequest.Create("http://www.google.com"); 
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
    { 
     WebHeaderCollection headers = response.Headers; 
     using (Stream answer = response.GetResponseStream()) 
     { 
      // Do stuff 
     } 
    } 
} 
catch (WebException e) when (e.Status == WebExceptionStatus.Timeout) 
{ 
    // If we got here, it was a timeout exception. 
} 
+1

Ngoài ra, đó là một thực hành tốt, rethrow các ngoại lệ nếu nó không phải là một ngoại lệ của loại hình Timeout – rolivares

+1

@rolivares Đó chắc chắn là một ý tưởng hay. Đã chỉnh sửa mã. –

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