2009-09-03 18 views
7

Mi aplicación asp.net enviar HttpWebRequest al servidor remoto RESTO ya la espera de la respuesta, y me encontré con que hay muchas mismo mensaje de error como este:cómo cerrar las conexiones subyacentes después de la captura de tiempo de espera HttpWebRequest

sistema. Net.WebException: la operación ha agotado el tiempo de espera. en System.Net.HttpWebRequest.GetResponse()

¿Es posible que después de que esta captura de excepción y cerrar la conexión HTTP subyacente directamente? o realmente no tengo que hacerlo porque ya configuré keepalive en falso?

Gracias.

En realidad, otra pregunta es si la excepción de tiempo de espera siempre ocurrió en System.Net.HttpWebRequest.GetResponse(), significa que la aplicación está esperando la respuesta del servidor remoto y no pudo obtener respuesta hasta que se agote el tiempo de espera. ¿cuál podría ser la razón posible, la conexión de red no es estable? servidor remoto no responde? otras posibles razones?

Aquí está el código:

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

Te diste la solución? Estoy luchando el mismo problema. Se me acabaron las ideas. –

+0

@ AlekseyBykov usted dijo que la respuesta marcada no resuelve su problema? alternativas? – Kiquenet

Respuesta

2

La simple regla empírica es que si no implementa IDisposal entonces no es necesario disponer de.

+0

no implementó IDisposal, pero encontré que hay muchas conexiones en la condición CLOSE_WAIT, no estoy seguro de lo que sucedió, me preocupa si mi código no manejó las conexiones subyacentes correctamente. – machinegone

+0

Creo que debes confiar en los diseñadores de Framework en este caso. Consulte http://stackoverflow.com/questions/716436/is-there-a-correct-way-to-dispose-of-a-httpwebrequest para obtener más información. –

+2

aunque en general es cierto que no resuelve este problema –

0

Asegúrese de desechar y cerrar.

O utilice usando bloques en lugar de try-finally:

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

disponer el objeto de respuesta no resuelve el problema –

0

Otra cosa que puede hacer es llamar al método Abort() en una HttpWebRequest que ha resultado en un error, al igual que :

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

no resuelve el problema –

Cuestiones relacionadas