tag net isdevelopment development asp asp.net httpresponse thread-abort

isdevelopment - Cuando se llama a un ASP.NET System.Web.HttpResponse.End(), ¿se interrumpe el hilo actual?



environment include production (5)

cuando un System.Web.HttpResponse.End () se llama System.Thread.Abort se está activando, lo que supongo es (o dispara) una excepción? Tengo un poco de registro y esto se está enumerando en el archivo de registro ...

Una primera oportunidad

exception of type ''System.Threading.ThreadAbortException'' occurred in mscorlib.dll 12/14/2008 01:09:31:: Error in Path :/authenticate Raw Url :/authenticate Message :Thread was being aborted. Source :mscorlib Stack Trace : at System.Threading.Thread.AbortInternal() at System.Threading.Thread.Abort(Object stateInfo) at System.Web.HttpResponse.End() at DotNetOpenId.Response.Send() at DotNetOpenId.RelyingParty.AuthenticationRequest.RedirectToProvider() at MyProject.Services.Authentication.OpenIdAuthenticationService.GetOpenIdPersonaDetails(Uri serviceUri) in C:/Users/Pure Krome/Documents/Visual Studio 2008/Projects/MyProject/Projects/Services/Authentication/OpenIdAuthenticationService.cs:line 108 at MyProject.Mvc.Controllers.AuthenticationController.Authenticate() in C:/Users/Pure Krome/Documents/Visual Studio 2008/Projects/MyProject/Projects/MVC Application/Controllers/AuthenticationController.cs:line 69 TargetSite :Void AbortInternal() A first chance exception of type ''System.Threading.ThreadAbortException'' occurred in Ackbar.Mvc.DLL An exception of type ''System.Threading.ThreadAbortException'' occurred in Ackbar.Mvc.DLL but was not handled in user code

¿Es este comportamiento normal y es posible abortar con gracia en lugar de (lo que parece) un aborto abrupto repentino?

Actualizar

Hasta ahora, el censo común es por diseño . Así que me pregunto si es posible que podamos hacer esta pregunta y ver si podemos modificar el código para que no parezca que estamos terminando el hilo prematuramente y salimos con gracia ... ¿Posible? Ejemplos de código?


Sí, esto es de hecho por diseño. Microsoft incluso lo ha documentado . ¿De qué otra forma podría evitar que se ejecute el resto de su programa?


No hay tal cosa como un aborto "elegante". Sin embargo, simplemente podría enjuagar () la respuesta en lugar de finalizarla y dejar que el marco se encargue de cerrar la conexión por usted. Supongo que en este caso desea que se envíe la respuesta al cliente, es decir, el caso típico.

De acuerdo con MSDN , al llamar a Response.End () lanza ThreadAbortException cuando la respuesta finaliza prematuramente. En realidad, solo debe llamar a Response.End () cuando desee que se haga la excepción.


No hay nada intrínsecamente descortés en una excepción que reaprovisiona tu pila para detener la ejecución actual. Ciertamente, no más de lo que arrojas una excepción y atrapando en un lugar inferior en su excepción.

Me gustaría filtrarlo desde tu registro. Si está utilizando el monitoreo de estado de ASP.Net, puede configurar / asignar cada excepción a un proveedor determinado (registro de eventos, correo, etc.) para controlar si recibe una notificación para las excepciones de threadabort o no. Si es un registro personalizado, simplemente agregaría un si para verificarlo.

Tenga en cuenta que no puede comer una ThreadAbortException así que incluso si su código de registro está haciendo algo como catch(Exception e) { // log exception and then do not throw again } ThreadAbortException seguirá siendo elevado nuevamente por el framework una vez que su catch block salidas.


No utilice el método Response.End () porque usa Application.End () y detiene la aplicación. Utilice además la solicitud o respuesta HTTP que viole el Ciclo de vida de la página. Utilice HttpContext.Current.Response.Close () o HttpContext.Current.ApplicationInstance.CompleteRequest ();


Utilicé todos los cambios anteriores, pero igual estaba obteniendo el mismo problema en mi aplicación web.

Luego me puse en contacto con mi proveedor de hosting y les pedí que verificaran si algún software o antivirus bloquea nuestros archivos para transferirlos a través de HTTP. o ISP / red no permite la transferencia de archivos.

Revisaron la configuración del servidor y omitieron el "Firewall compartido del centro de datos" para mi servidor y ahora nuestra aplicación comenzó a descargar el archivo.

Espero que esta respuesta ayude a alguien. Esto es lo que funcionó para mí