Cuando se llama a un System.Web.HttpResponse.End ASP.NET (), se interrumpe el flujo actual?

StackOverflow https://stackoverflow.com/questions/365249

Pregunta

cuando un System.Web.HttpResponse.End () se llama un System.Thread.Abort está siendo disparado, lo que yo supongo es (o incendios) una excepción? Tengo un poco de la tala y esto se está enumerado 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 brusca repentina?

Actualizar

Hasta ahora el censo común que es por diseño . Así que me pregunto si es posible que pudiéramos tomar esta pregunta y ver si podíamos modificar el código para que sea no se siente como que estamos terminando la rosca prematuramente y con gracia salir ... Posible? Ejemplos de código?

¿Fue útil?

Solución

Sí, esto es de hecho por diseño. Microsoft ha incluso href="http://msdn.microsoft.com/lv-lv/library/system.web.httpresponse.end(en-us).aspx" documentado eso. ¿Cómo más se puede detener el resto de su programa de ejecución?

Otros consejos

No hay tal cosa como un "elegante" abortar. Usted podría simplemente Flush () la respuesta, sin embargo, en lugar de acabar con ella y dejar que el marco cuidar de cerrar la conexión para usted. Estoy asumiendo en este caso que desea que la respuesta enviada al cliente, es decir, el caso típico.

De acuerdo con MSDN , llamando Respuesta .End () lanza la ThreadAbortException cuando la respuesta termina prematuramente. Que realmente sólo debe llamar Response.End () cuando se desea la excepción levantó.

No hay nada inherentemente poco elegante sobre una excepción de manera recursiva hasta su pila para detener la ejecución actual. Ciertamente no más que lanzar una excepción y la captura de él en algún lugar más bajo en su excepción.

me vería en la filtra desde su registro. Si está utilizando el seguimiento de la salud puede configurar ASP.Net / mapear cada excepción a un proveedor determinado (registro de eventos, correo, etc.) para controlar si se obtiene una notificación para ThreadAbort excepciones o no. Si se trata de registro personalizado entonces me acaba de añadir una para comprobar si para ello.

Tenga en cuenta que no se puede comer una ThreadAbortException por lo que incluso si su código de registro está haciendo algo así como el catch(Exception e) { // log exception and then do not throw again } ThreadAbortException todavía será levantado de nuevo por el marco una vez que sus salidas del bloque de captura.

No utilizar el método Response.End (), ya que utiliza Application.End () y detener la aplicación. Petición de más uso o la respuesta HTTP que viola Página del Ciclo de Vida. Utilice HttpContext.Current.Response.Close () o HttpContext.Current.ApplicationInstance.CompleteRequest ();

He utilizado todos los cambios anteriores, pero todavía me estaba poniendo mismo problema en mi aplicación web.

Entonces me comuniqué con mi alojamiento y proporcionar les pidió que comprobar si el software antivirus o el bloqueo de nuestros archivos para transferir a través de HTTP. o ISP / red no está permitiendo que archivos para transferir.

Comprobaron la configuración del servidor de derivación y el "centro de datos compartido del servidor de seguridad" para mi servidor y ahora nuestra aplicación empezaron a descargar el archivo.

Espero que esta respuesta le ayudará someone.This es lo que funcionó para mí

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top