Lo que podría causar ThreadAbortException al usar HttpWebRequest.GetResponse ()

Estoy viviendo en pesadillas debido a esta situación, tengo un HttpWebRequest.GetResponse que me sigue dando una ThreadAbortException, que hace que toda la aplicación se apague.

¿Cómo puedo evitar eso, o al menos manejarlo, sería útil utilizar Thread.ResetAbort() en tal caso?

Para explicar más aquí hay una muestra de código aproximado:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://someurl.com/");
HttpWebResponse resp = req.GetResponse();

ahora la última línea anterior arroja la ThreadAbortException, puede ser porque la solicitud excedió el tiempo de espera, lo que está bien, pero no quiero obtener una ThreadAbortException dentro de mi aplicación ASP.NET 2.0 porque la mata. ThreadAborException no se puede atrapar con try/catch, la única forma de manejarlo es usar Thread.ResetAbort (), que también tiene sus propios efectos nocivos, mantendrá el hilo de vida y solo Dios sabe por cuánto tiempo.

12
Intente capturar una System.Exception en la segunda línea allí y vea qué tipo de ex arroja.
agregado el autor StingyJack, fuente
Usted puede atrapar ThreadAbortException, solo tiene que manejarlo correctamente. ResetAbort() es lo correcto cuando hayas terminado. Consulte msdn.microsoft.com/en-us/library/&hellip ; por más.
agregado el autor Bob King, fuente

4 Respuestas

Por lo que dices, parece que estás realizando una WebRequest saliente a un recurso externo desde el procesamiento de una solicitud entrante a una aplicación ASP.NET. Hay (al menos) dos tiempos de espera que son relevantes aquí:

  • WebRequest.Timeout (predeterminado 100000ms = 100s) especifica el tiempo de espera para la ejecución de la WebRequest saliente. Si este tiempo de espera expira, debe obtener una WebException, por lo que este no es su problema.

  • El HttpRuntime que está procesando su solicitud entrante tiene un tiempo de espera de ejecución: el valor predeterminado de acuerdo con MSDN es 110s para .NET 2.0 o posterior, 90s para .NET 1.x. Cuando expire este tiempo de espera, obtendrá una ThreadAbortException. Parece que esto es lo que está sucediendo.

In .NET 1.x, you'd expect this, because the default HttpRuntime executionTimeout is less than WebRequest.Timeout. In .NET 2.0, you'd expect this with the default timeouts if you have already spent >10s before making the outgoing WebRequest (e.g. if you have more than one outgoing WebRequest from within the same incoming request).

Yo sugeriría que:

  • Reduce WebRequest.Timeout para solicitudes salientes, y maneja WebException, o

  • Si las solicitudes salientes realmente pueden tomar tanto tiempo, entonces aumente el tiempo de espera de ejecución httpRuntime como se describe en MSDN .

12
agregado
httpRuntime.executionTimeout fue el culpable en mi escenario, ¡gracias!
agregado el autor RobSiklos, fuente

I had this problem with using Response. Check out this article for some workarounds. http://support.microsoft.com/kb/312629

También eche un vistazo a esta documentación de MSDN en la sección de WebException y Comentarios. http://msdn.microsoft.com/en- us/library/system.net.httpwebrequest.getresponse.aspx

Se puede atrapar esta excepción ... Si tiene problemas para detectar la correcta, intente capturar una excepción general (excepción de sistema) y a partir de allí la ruta de la pila le indicará el tipo específico (HttpException, WebException, etc.) a en realidad atrapar.

2
agregado

Nuestra aplicación lanzó ThreadAbortException todo el tiempo b/c de Llamadas Response.Redirect ("url"). La aplicación nunca se cerró, probablemente b/c la excepción fue capturada en algún momento y se mantuvo activa.

Incidentalmente, Response.Redirect ("url", false) evitará que la respuesta termine con la excepción. La publicación de Andrew se vincula a soluciones similares para diferentes usos de la clase de respuesta.

0
agregado
Esto es preciso (Response.Redirect (url) llama a Response.End que arroja una ThreadAbortException) pero no es relevante para la situación del OP.
agregado el autor Joe, fuente

He visto los problemas enumerados por Andrew y "ForCripesSake".

Otra posibilidad para su ThreadAbortException es cualquier código que se ejecute fuera del ciclo de vida de la solicitud de página en el lado del servidor, como HttpModules y HttpHandlers. Cualquier excepción arrojada dentro de un módulo o manejador no va al mecanismo de excepciones no controladas predeterminado en ASP.Net, y puede hacer que el hilo muera.

Hay un par de excepciones que no se pueden manejar fácilmente en ASP.net o CLR en general, de acuerdo con este artículo:

Mejores prácticas de confiabilidad

No estoy seguro de si se aplica al código del cliente que ha enumerado en su pregunta, pero podría estar relacionado.

¡Espero que ayude!

0
agregado