How to Avoid Response.End() "Thread was being aborted" Exception during the Excel file download
I tried to convert my dataset into excel and download that excel .I got my required excel file.But System.Threading.ThreadAbortException was raised every excel download. How to resolve this issue ?.. Please help me...
I call this method in my aspx screen.There also same exception has thrown by this method.
I call that public void ExportDataSet(DataSet ds) function in many aspx screens and also I am maintaining error logger method for exceptions which are raised at runtime right those exceptions are write into a .txt files. So that same exception is logged in all the aspx screen's txt files.I just want to avoid this exception throws from method declared class file to aspx. Simply i just want to handle this exception at my method declaration class file itself.
ASPX File Method call: excel.ExportDataSet(dsExcel);
Method Definition:
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
{
}
}
I researched online and saw that the Response.End()
always throws an exception.
Replace this: HttpContext.Current.Response.End();
With this:
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.
This helped me to handle Thread was being aborted
exception,
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);
}
}
if you use the following the following code instead of HttpContext.Current.Response.End()
, you will get Server cannot append header after HTTP headers have been sent
exception.
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.SuppressContent = True;
HttpContext.Current.ApplicationInstance.CompleteRequest();
Hope it helps
Looks to be the same question as:
When an ASP.NET System.Web.HttpResponse.End() is called, the current thread is aborted?
So it's by design. You need to add a catch for that exception and gracefully "ignore" it.
Move the Response.End() to outside of the Try/Catch and Using blocks.
It's suppose to throw an Exception to bypass the rest of the request, you just weren't suppose to catch it.
bool endRequest = false;
try
{
.. do stuff
endRequest = true;
}
catch {}
if (endRequest)
Resonse.End();
Just put the
Response.End();
within a finally block instead of within the try block.
This has worked for me!!!.
I had the following problematic (with the Exception) code structure
...
Response.Clear();
...
...
try{
if (something){
Reponse.Write(...);
Response.End();
return;
}
some_more_code...
Reponse.Write(...);
Response.End();
}
catch(Exception){
}
finally{}
and it throws the exception. I suspect the Exception is thrown where there is code / work to execute after response.End(); . In my case the extra code was just the return itself.
When I just moved the response.End(); to the finally block (and left the return in its place - which causes skipping the rest of code in the try block and jumping to the finally block (not just exiting the containing function) ) the Exception ceased to take place.
The following works OK:
...
Response.Clear();
...
...
try{
if (something){
Reponse.Write(...);
return;
}
some_more_code...
Reponse.Write(...);
}
catch(Exception){
}
finally{
Response.End();
}