Тема была прервана при экспорте в Excel? - PullRequest
4 голосов
/ 07 января 2009

У меня есть DataTable, который связан с GridView. У меня также есть кнопка, которая при нажатии экспортирует DataTable в файл Excel. Однако возникает следующая ошибка:

ErrMsg = "Тема была прервана."

Вот часть кода, в которую выдается ошибка:

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
    {

    }
}

После изменения HttpContext.Current.Response.End на HttpContext.Current.ApplicationInstance.CompleteRequest теперь он просто переходит в блок finally, и я не могу выяснить, какое сообщение об ошибке выдается.

Ответы [ 5 ]

9 голосов
/ 07 января 2009

Исключение ThreadAbortException выбрасывается из следующей строки:

HttpContext.Current.Response.End();

Вот еще подробности и обходной путь.

5 голосов
/ 01 апреля 2013

Я пытался использовать HttpContext.Current.ApplicationInstance.CompleteRequest. Он работал, но также экспортировал полный HTML-код страницы в конце загруженного файла, что было нежелательно.

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

Затем, после огромных усилий, я наткнулся на приведенный выше код. И он прекрасно работает без каких-либо исключений или нежелательного кода в конце загруженного файла.

Источник

0 голосов
/ 23 февраля 2017

Это просто, вы можете попробовать:

Response.Close(); вместо Response.End();

0 голосов
/ 18 апреля 2013

У меня была другая история, я использую telerik элементы управления, и NONE помог мне, в конце концов я узнал, что мне нужно было просто обернуть мою разметку в telerik: RadAjaxPanel ниже приведен фрагмент кода для отключения ajax в обработчике событий на стороне клиента RequestStart.

<telerik:RadAjaxPanel runat="server" 
    ClientEvents-OnRequestStart="AjaxRequestStart">

и затем в своем пользовательском элементе управления я добавил еще одну функцию, как показано ниже:

<script type="text/javascript">
    function AjaxRequestStart(target, arguments) {
        arguments.set_enableAjax(false);
}

0 голосов
/ 27 июля 2010

Исключение было вызвано Response.End

Одна вещь, которую вы можете сделать, это логически перехватить сообщение об исключении ...

этот метод не повлияет на данные, а только на исключение ...

Try

    .........(codes here)
    Response.End

Catch ex as Message

    If Not ex.Message = "Thread was being aborted." Then
         Response.write(ex.message)
    End If

End Try
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...