2014-11-30 21 views
16

Ho una domanda molto semplice. Sto caricando file su un server usando HTTP POST. Il fatto è che ho bisogno di gestire in modo specifico i timeout delle connessioni e aggiungere un po 'di algoritmo di attesa dopo che si è verificato un timeout per rivivere il server.HttpWebRequest timeout handling

Il mio codice è piuttosto semplice:

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 
    } 
} 

ho omesso il file lettura del codice in quanto non è la nostra preoccupazione. Ora ho bisogno di assicurarmi che una volta lanciata una WebException, filtri l'eccezione per vedere se si tratta davvero di un'eccezione di timeout. Ho pensato di confrontarmi con il messaggio di eccezione, ma non sono sicuro che questa sia la strada giusta dal momento che l'applicazione in questione è un'app commerciale e temo che il messaggio varia da una lingua all'altra. E quale messaggio dovrei cercare.

Qualche suggerimento?

risposta

27

Potete guardare WebException.Status. Il WebExceptionStatus enum ha una bandiera 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; 
} 

con C# 6 filtri eccezione può tornare utile qui:

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

Inoltre, è una buona pratica, rigenerare l'eccezione, se non fosse un'eccezione di tipo Timeout – rolivares

+1

@rolivares Questa è sicuramente una buona idea. Modificato il codice –