Traté de convertir mi conjunto de datos en Excel y descargar ese Excel. Obtuve mi archivo de Excel requerido. Pero System.Threading.ThreadAbortException se generó en cada descarga de Excel. ¿Cómo resolver este problema? .. Por favor ayúdame ...
Llamo a este método en mi pantalla aspx También hay la misma excepción lanzada por este método.
Llamo a esa función pública void ExportDataSet (DataSet ds) en muchas pantallas aspx y también estoy manteniendo el método de registro de errores para las excepciones que se generan en tiempo de ejecución, esas excepciones se escriben en archivos .txt. Entonces, esa misma excepción se registra en todos los archivos txt de la pantalla aspx. Solo quiero evitar que esta excepción se arroje desde el archivo de clase declarado del método a aspx. Simplemente solo quiero manejar esta excepción en el archivo de clase de declaración de mi método.
Llamada al método de archivo ASPX: 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
{
}
}
Response.End
vea stackoverflow.com/a/3917180/2864740 (y las otras respuestas); tenga en cuenta que la excepción es "de esperar", ya que es la forma en que se desenrolla la pila (así que no atrape esa excepción). Si aún desea capturar [otras] excepciones, use:.. catch (ThreadAbortException) { throw; /* propagate */ } catch (Exception ex) { .. }
Respuestas:
Investigué en línea y vi que
Response.End()
siempre arroja una excepción.Reemplazar esto:
HttpContext.Current.Response.End();
Con este:
fuente
Response.End()
no , no trabajar, ¿por qué la respuesta sugerida tiene tambiénResponse.End()
en la última línea? ¡En cambio, la respuesta de @Binny (abajo) ayuda!Esto me ayudó a manejar la
Thread was being aborted
excepción,si usa el siguiente código en lugar de
HttpContext.Current.Response.End()
, obtendrá unaServer cannot append header after HTTP headers have been sent
excepción.Espero eso ayude
fuente
Response.End()
no funciona, pero el método sugerido también tieneResponse.End()
en la última línea?Parece ser la misma pregunta que:
Cuando se llama a ASP.NET System.Web.HttpResponse.End (), ¿se cancela el hilo actual?
Entonces es por diseño. Debe agregar una captura para esa excepción y "ignorarla" con gracia.
fuente
Mueva Response.End () fuera de los bloques Try / Catch y Using.
Se supone que debe lanzar una excepción para omitir el resto de la solicitud, simplemente no se suponía que debías detectarla.
fuente
Solo pon el
dentro de un bloque finalmente en lugar de dentro del bloque try.
¡¡¡Esto me ha funcionado !!!.
Tuve la siguiente estructura de código problemática (con la excepción)
y lanza la excepción. Sospecho que la excepción se lanza cuando hay código / trabajo para ejecutar después de la respuesta.End (); . En mi caso, el código adicional fue solo la devolución.
Cuando acabo de mover la respuesta.End (); al bloque finalmente (y dejó el retorno en su lugar, lo que provoca que se salte el resto del código en el bloque try y salte al bloque finalmente (no solo saliendo de la función contenedora)) la Excepción dejó de tener lugar.
Lo siguiente funciona bien:
fuente
Utilice un bloque de captura especial para la excepción del método Response.End ()
O simplemente elimine Response.End () si está creando un administrador de archivos
fuente
Para mi solo funciona
https://stackoverflow.com/a/21043051/1828356
fuente
Eliminé el botón de enlace del UpdatePanel y también comenté el Response.End () Success !!!
fuente
el error de Response.END (); se debe a que está usando un panel de actualización de asp o cualquier control que use javascript, intente usar el control nativo de asp o html sin javascript o scriptmanager o scripting y vuelva a intentarlo
fuente
Esto no es un problema, pero 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 proporcionada 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
fuente
descargar la respuesta al cliente antes de response.end ()
Más sobre el método Response.Flush
Así que use el código mencionado a continuación antes
response.End();
fuente
Usé todos los cambios anteriores, pero aún así recibía el mismo problema en mi aplicación web.
Luego me comuniqué con mi proveedor de alojamiento 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í
fuente
Encontré la razón. Si quita los paneles de actualización, ¡funciona bien!
fuente
Recomiendo esta solución:
No use
response.End();
Declare esta var global:
bool isFileDownLoad;
Justo después de tu
(response.Write(sw.ToString());) set ==> isFileDownLoad = true;
Anula tu Render como:
fuente
Descubrí que lo siguiente funcionaba mejor ...
fuente
Para mí, me ayudó a registrar un botón que llama al código detrás del código como un control de devolución.
fuente