Thread was being aborted when exporting to excel?

17,982

Solution 1

The ThreadAbortException is thrown from the following line:

HttpContext.Current.Response.End();

Here's more details and a workaround.

Solution 2

I tried using HttpContext.Current.ApplicationInstance.CompleteRequest. It did work but also exported the complete HTML Code of the page at the end of the downloaded file, which was undesirable.

Response.BuffferOutput = True;
Response.Flush();
Response.Close();

Then after a hell of effort, I bumped into the above code. And it works perfectly without any exception or undesirable code at the end of the downloaded file.

Source

Share:
17,982

Related videos on Youtube

Vishal_Kotecha
Author by

Vishal_Kotecha

Updated on April 22, 2022

Comments

  • Vishal_Kotecha
    Vishal_Kotecha about 2 years

    I have a DataTable which is bound to a GridView. I also have a button that when clicked exports the DataTable to an Excel file. However, the following error is occuring:

    ErrMsg = "Thread was being aborted."

    Here is part of the code where the error is being thrown:

    private static void Export_with_XSLT_Web(DataSet dsExport, 
                                             string[] sHeaders,
                                             string[] sFileds, 
                                             ExportFormat FormatType,
                                             string FileName)
    {
        try
        {
            // Appending Headers
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.Buffer = true;
    
            if(FormatType == ExportFormat.CSV)
            {
                HttpContext.Current.Response.ContentType = "text/csv";
                HttpContext.Current.Response.AppendHeader("content-disposition",
                                                          "attachment; 
                                                          filename=" + FileName);
            }
            else
            {
                HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
                HttpContext.Current.Response.AppendHeader("content-disposition", 
                                                          "attachment; 
                                                          filename=" + FileName);
            }
    
            // XSLT to use for transforming this dataset.                       
            MemoryStream stream = new MemoryStream();
            XmlTextWriter writer = new XmlTextWriter(stream, Encoding.UTF8);
    
            CreateStylesheet(writer, sHeaders, sFileds, FormatType);
            writer.Flush();
            stream.Seek(0, SeekOrigin.Begin);
    
            XmlDataDocument xmlDoc = new XmlDataDocument(dsExport);
            //dsExport.WriteXml("Data.xml");
            XslTransform xslTran = new XslTransform();
            xslTran.Load(new XmlTextReader(stream), null, null);
    
            using(StringWriter sw = new StringWriter())
            {
                xslTran.Transform(xmlDoc, null, sw, null);
    
                //Writeout the Content              
                HttpContext.Current.Response.Write(sw.ToString());                
                writer.Close();
                stream.Close();
                HttpContext.Current.Response.End();
            }
        }
        catch(ThreadAbortException Ex)
        {
            string ErrMsg = Ex.Message;
        }
        catch(Exception Ex)
        {
            throw Ex;
        }
        finally
        {
    
        }
    }
    

    After changing HttpContext.Current.Response.End to HttpContext.Current.ApplicationInstance.CompleteRequest, it now just goes to the finally block and I can't figure out what error message is being thrown.

  • Vishal_Kotecha
    Vishal_Kotecha over 15 years
    I made the change, but now it just goes into the finally block and I can't figure out what the problem is now.
  • Darin Dimitrov
    Darin Dimitrov over 15 years
    The code execution will always enter the finally block even if no exception is thrown.
  • Darin Dimitrov
    Darin Dimitrov over 15 years
    If you want to handle other exceptions just add the catch(Exception ex) clause.
  • Jui Test
    Jui Test about 8 years
    Thanks Viral for ur help.It work for me.Thanks for saving my time.Instead of response.end() I wrote following 3 lines.Response.BuffferOutput = True; Response.Flush(); Response.Close();