thread subproceso net end being asp anulado aborted asp.net

asp.net - subproceso - system web http response end threadabortexception



Context.Response.End() y Thread estaban siendo abortados (6)

¿Hay alguna razón específica por la que no esté usando context.ApplicationInstance.CompleteRequest() lugar?

Este método cortocircuitará la tubería de ASP.NET (excepto el evento EndRequest) sin lanzar la excepción ThreadAbortException por lo que no necesitará el bloque adicional try / catch , y también experimentará un mejor rendimiento.

Estoy intentando cerrar la respuesta usando Context.Response.End pero recibo el error "Thread was being aborted" .

¿Cómo cierro correctamente la respuesta sin desencadenar una excepción?

try { Context.Response.Clear(); Context.Response.ContentType = "text/html"; //Context.Response.ContentType = "application/json"; JsonObjectCollection collection = new JsonObjectCollection(); collection.Add(new JsonNumericValue("resultcode", 1)); collection.Add(new JsonStringValue("sourceurl", exchangeData.cUrl)); collection.Add(new JsonStringValue("filename", fileName)); collection.Add(new JsonStringValue("filesize", fileSize)); collection.Add(new JsonStringValue("fileurl", Common.GetPDFURL + outputFileName)); JsonUtility.GenerateIndentedJsonText = true; Context.Response.Write(collection); try { Context.Response.End(); } catch (ThreadAbortException exc) { // This should be first catch block i.e. before generic Exception // This Catch block is to absorb exception thrown by Response.End } } catch (Exception err) { }

Resuelto por mí mismo, el código debería verse como

try { Context.Response.End(); } catch (ThreadAbortException err) { } catch (Exception err) { }


Error: el hilo estaba siendo abortado. en System.Threading.Thread.AbortInternal () en System.Threading.Thread.Abort (Object stateInfo) en System.Web.HttpResponse.End ()

Este error se produce principalmente si utiliza Response.End, Response.Redirect o Server.Transfer

Causa: el método Response.End finaliza la ejecución de la página y cambia la ejecución al evento Application_EndRequest en el canal de eventos de la aplicación. La línea de código que sigue a Response.End no se ejecuta.

Este problema ocurre en los métodos Response.Redirect y Server.Transfer porque ambos métodos llaman Response.End internamente.

Resolución / Solución:

Puede usar una declaración try-catch para capturar esta excepción

o

Para Response.End, llame al método HttpContext.Current.ApplicationInstance.CompleteRequest en lugar de Response.End para omitir la ejecución del código al evento Application_EndRequest. Para Response.Redirect, use una sobrecarga, Response.Redirect (String url, bool endResponse) que pasa falso para el parámetro endResponse para suprimir la llamada interna a Response.End. Por ejemplo: ex: Response.Redirect (“nextpage.aspx”, false); Si utiliza esta solución alternativa, se ejecuta el código que sigue a Response.Redirect. Para Server.Transfer, use el método Server.Execute en su lugar.


Esto me ayudó a manejar.

try { //Write HTTP output HttpContext.Current.Response.Write(Data); } catch (Exception exc) {} finally { try { //stop processing the script and return the current result HttpContext.Current.Response.End(); } catch (Exception ex) {} finally { //Sends the response buffer HttpContext.Current.Response.Flush(); // Prevents any other content from being sent to the browser HttpContext.Current.Response.SuppressContent = true; //Directs the thread to finish, bypassing additional processing HttpContext.Current.ApplicationInstance.CompleteRequest(); //Suspends the current thread Thread.Sleep(1); } }

si usa el siguiente código en lugar de HttpContext.Current.Response.End() , obtendrá que el Server cannot append header after HTTP headers have been sent excepto.

HttpContext.Current.Response.Flush(); HttpContext.Current.Response.SuppressContent = True; HttpContext.Current.ApplicationInstance.CompleteRequest();

Otra Thread.BeginCriticalRegion(); que encontré es Thread.BeginCriticalRegion();

try { //Write HTTP output HttpContext.Current.Response.Write(Data); } catch (Exception exc) {} finally { try { //Notifies a host that execution is about to enter a region of code in which the effects of a thread abort or unhandled exception might jeopardize other tasks in the application domain. Thread.BeginCriticalRegion(); HttpContext.Current.Response.End(); } catch (Exception ex) {} finally { //Sends the response buffer HttpContext.Current.Response.Flush(); // Prevents any other content from being sent to the browser HttpContext.Current.Response.SuppressContent = true; //Directs the thread to finish, bypassing additional processing HttpContext.Current.ApplicationInstance.CompleteRequest(); Thread.EndCriticalRegion(); } }

Espero eso ayude


Intente response.OutputStream.Close (); en lugar de response.End (); ¡Ayudará!


O puede colocar el contexto.Response.End () dentro de un bloque final . De esa manera, no tendrá que preocuparse por la excepción ThreadAbortException no deseada, ni ignorará la excepción ThreadAbortException real (que es mala). Tampoco ignorará las etapas de la tubería.

try { context.Response.ContentType = "application/json"; context.Response.ContentEncoding = Encoding.UTF8; if (NotAuthorized()) { context.Response.StatusCode = (int)System.Net.HttpStatusCode.Unauthorized; return; } context.Response.Write(MakeJsonStuff()); } catch (Exception ex) { LogException(ex); context.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError; context.Response.Write(MakeJsonError(ex)); } finally { context.Response.End(); }


Recomiendo esta solución:

  1. No use response.End ();

  2. Declare esta var global: bool isFileDownLoad;

  3. Justo después de su (response.Write (sw.ToString ());) set ==> isFileDownLoad = true;

  4. Anula tu Render como

    /// /// AEG: Muy importante para manejar el subproceso abortado excepción /// /// anular la protección del vacío (HtmlTextWriter w) {if (! IsFileDownLoad) base.Render (w); }