Cómo evitar Response.End () “El hilo se estaba cancelando” Excepción durante la descarga del archivo de Excel

Traté de convertir mi conjunto de datos en Excel y descargar ese Excel. Recibí mi archivo de Excel requerido. Pero System.Threading.ThreadAbortException se presentó cada descarga de Excel. ¿Cómo resolver este problema? Por favor, ayúdenme …

Llamo a este método en mi pantalla aspx. También ha lanzado la misma excepción con este método.

Llamo a esa función publicDaid ExportDataSet (DataSet ds) en muchas pantallas aspx y también estoy manteniendo el método del registrador de errores para las excepciones que se generan en tiempo de ejecución, esas excepciones son escritas en un archivo .txt. Por lo tanto, esa misma excepción se registra en todos los archivos txt de la pantalla aspx. Solo quiero evitar que esta excepción arroje del archivo de clase de método declarado a aspx. Simplemente quiero manejar esta excepción en mi propio archivo de clases de statement de métodos.

Llamada al método ASPX File: excel.ExportDataSet (dsExcel);

Definición del método:

public void ExportDataSet(DataSet ds) { try { string filename = "ExcelFile.xls"; HttpResponse response = HttpContext.Current.Response; response.Clear(); response.Charset = ""; response.ContentType = "application/vnd.ms-excel"; response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\""); using (StringWriter sw = new StringWriter()) { using (HtmlTextWriter htw = new HtmlTextWriter(sw)) { GridView dg = new GridView(); dg.DataSource = ds.Tables[0]; dg.DataBind(); dg.RenderControl(htw); // response.Write(style); response.Write(sw.ToString()); response.End(); // Exception was Raised at here } } } catch (Exception ex) { string Err = ex.Message.ToString(); EsHelper.EsADLogger("HOQCMgmt.aspx ibtnExcelAll_Click()", ex.Message.ToString()); } finally { } } 

Investigué en línea y vi que Response.End() siempre arroja una excepción.

Reemplace esto: HttpContext.Current.Response.End();

Con este:

 HttpContext.Current.Response.Flush(); // Sends all currently buffered output to the client. HttpContext.Current.Response.SuppressContent = true; // Gets or sets a value indicating whether to send HTTP content to the client. HttpContext.Current.ApplicationInstance.CompleteRequest(); // Causes ASP.NET to bypass all events and filtering in the HTTP pipeline chain of execution and directly execute the EndRequest event. 

Esto me ayudó a manejar la excepción de Thread was being aborted ,

 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 utiliza el siguiente código en lugar de HttpContext.Current.Response.End() , obtendrá Server cannot append header after HTTP headers have been sent excepción.

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

Espero eso ayude

Parece ser la misma pregunta que:

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

Entonces es por diseño. Debe agregar una captura para esa excepción y con gracia “ignorarla”.

Use un bloque catch especial a excepción del método Response.End ()

 { ... context.Response.End(); //always throws an exception } catch (ThreadAbortException e) { //this is special for the Response.end exception } catch (Exception e) { context.Response.ContentType = "text/plain"; context.Response.Write(e.Message); } 

O simplemente elimine Response.End () si está construyendo un manejador de archivos

Mueva Response.End () fuera de los bloques Try / Catch y Using.

Se supone que debe lanzar una excepción para eludir el rest de la solicitud, pero no se suponía que pudieras atraparla.

 bool endRequest = false; try { .. do stuff endRequest = true; } catch {} if (endRequest) Resonse.End(); 

Solo pon el

 Response.End(); 

dentro de un bloque finally en lugar de dentro del bloque try.

¡Esto ha funcionado para mí!

Tenía la siguiente estructura de código problemática (con la excepción)

 ... Response.Clear(); ... ... try{ if (something){ Reponse.Write(...); Response.End(); return; } some_more_code... Reponse.Write(...); Response.End(); } catch(Exception){ } finally{} 

y arroja la excepción. Sospecho que la excepción se produce donde hay código / trabajo para ejecutar después de response.End (); . En mi caso, el código adicional era solo el retorno.

Cuando acabo de mover la respuesta. Fin (); al bloque finally (y dejó el retorno en su lugar), lo que provoca omitir el rest del código en el bloque try y saltar al bloque finally (no solo salir de la función contenedora)), el Exception dejó de tener lugar.

Lo siguiente funciona bien:

 ... Response.Clear(); ... ... try{ if (something){ Reponse.Write(...); return; } some_more_code... Reponse.Write(...); } catch(Exception){ } finally{ Response.End(); } 

Para mí solo funciona

HttpContext.Current.ApplicationInstance.CompleteRequest ().

https://stackoverflow.com/a/21043051/1828356

el error para Response.END (); se debe a que está utilizando un panel de actualización asp o cualquier control que utilice javascript, intente utilizar control nativo de asp o html sin javascript o scriptmanager o scripting y vuelva a intentarlo

Eliminé el botón de enlace de UpdatePanel y también comenté Response.End () Success !!!

Esto no es problema, pero esto es por diseño. La causa raíz se describe en la Página de soporte de Microsoft.

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

La Solución provista es:

Para Response.End, llame al método HttpContext.Current.ApplicationInstance.CompleteRequest en lugar de Response.End para omitir la ejecución del código en el evento Application_EndRequest

Aquí está el enlace: https://support.microsoft.com/en-us/help/312629/prb-threadabortexception-occurs-if-you-use-response-end–response-redi

Recomiendo esta solución:

  1. No use response.End ();

  2. Declare este global var: bool isFileDownLoad;

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

  4. Anula tu Render como:

    /// AEG: Muy importante para manejar la excepción abortada por el hilo

    anular el Render vacío protegido (HtmlTextWriter w) {if (! isFileDownLoad) base.Render (w); }

enjuague la respuesta al cliente antes de response.end ()

Más acerca del método Response.Flush

Por lo tanto, utilice el código mencionado más abajo antes de response.End();

 response.Flush(); 

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.

Verificaron la configuración del servidor y omitieron el “Firewall compartido del centro de datos” para mi servidor y ahora nuestra aplicación puede descargar el archivo.

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