controlar c# .net exception timeout httpwebrequest

c# - controlar - HttpWebRequest tiempo de espera de manejo



httpwebrequest timeout (3)

Tengo una pregunta muy simple. Estoy cargando archivos a un servidor usando HTTP POST. La cosa es que debo manejar especialmente los tiempos de espera de conexión y agregar un poco de un algoritmo de espera después de que se haya producido un tiempo de espera para revivir el servidor.

Mi código es bastante simple:

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

Omití el código de lectura del archivo, ya que no es nuestra preocupación. Ahora necesito asegurarme de que una vez que se lance una WebException, filtre la excepción para ver si es realmente una excepción de tiempo de espera. Pensé en comparar con el mensaje de excepción, pero no estoy seguro de si esta es la forma correcta, ya que la aplicación en cuestión es una aplicación comercial y me temo que el mensaje varía entre los diferentes idiomas. Y qué mensaje debería estar buscando.

¿Alguna sugerencia?


La respuesta de Yuval es un éxito directo, pero aquí hay una versión mía que he probado desde que sufrí en la misma circunstancia si quiere apuntar a través de los códigos de estado:

catch (WebException ex) { var hwr = (HttpWebResponse)ex.Response; if (hwr != null) { var responseex = hwr.StatusCode; int statcode = (int)responseex; if (statcode == 404) { Utility.Instance.log(logPath, "The file might not be availble yet at the moment. Please try again later or contact your system administrator.", true); } if (statcode == 401) { Utility.Instance.log(logPath, "Username and Password do not match.", true); } if (statcode == 408) { Utility.Instance.log(logPath, "The operation has timed out", true); } } else { Utility.Instance.log(logPath, ex + ". Please contact your administrator.", true);//Or you can do a different thing here } }


Puedes mirar en WebException.Status . La enumeración WebExceptionStatus tiene un indicador de tiempo de 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; }

El uso de filtros de excepción C # 6 puede ser útil aquí:

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