Как избежать Response.End() "Тема прерывается" Исключение во время загрузки файла Excel

Я попытался преобразовать свой набор данных в excel и загрузить, что excel. Я получил требуемый файл excel. Но System.Threading.ThreadAbortException был поднят каждый раз, когда вы загружаете excel. Как решить эту проблему?.. Пожалуйста, помогите мне...

Я вызываю этот метод в моем aspx-экране. Это же исключение вызвало и этот метод.

Я вызываю функцию public void ExportDataSet (DataSet ds) во многих экранах aspx, а также поддерживаю метод журнала ошибок для исключений, которые возникают во время выполнения, причем эти исключения записываются в TXT файлы. Таким образом, это же исключение регистрируется во всех файлах txt aspx screen. Я просто хочу, чтобы это исключение выбрало из объявленного класса класс файла aspx. Просто я просто хочу обработать это исключение в самом файле класса объявления метода.

вызов метода файла ASPX:  excel.ExportDataSet(dsExcel);

Определение метода:

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
   {                
   }
}

Ответ 1

Я исследовал онлайн и видел, что Response.End() всегда выдает исключение.

Замените это: HttpContext.Current.Response.End();

С этим:

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.

Ответ 2

Это помогло мне обработать исключение 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);
     }
   }

если вы используете следующий код вместо HttpContext.Current.Response.End(), вы получите исключение Server cannot append header after HTTP headers have been sent.

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

Надеюсь, что это поможет

Ответ 4

Используйте специальный блок catch для исключения метода 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);
}

Или просто удалите Response.End(), если вы создаете файл-манипулятор

Ответ 5

Переместите Response.End() на внешнюю часть блоков Try/Catch and Using.

Предположим, что вы исключили исключение, чтобы обойти остальную часть запроса, вы просто не могли его поймать.

bool endRequest = false;

try
{
    .. do stuff
    endRequest = true;
}
catch {}

if (endRequest)
    Resonse.End();

Ответ 7

Просто поставьте

Response.End();

в блоке finally, а не в блоке try.

Это сработало для меня!!!.

У меня была следующая проблемная структура кода (с исключением)

...
Response.Clear();
...
...
try{
 if (something){
   Reponse.Write(...);
   Response.End();

   return;

 } 

 some_more_code...

 Reponse.Write(...);
 Response.End();

}
catch(Exception){
}
finally{}

и это исключает исключение. Я подозреваю, что Exception выбрано, где есть код/​​работа для выполнения после response.End();, В моем случае дополнительный код был только результатом.

Когда я просто переместил response.End(); к блоку finally (и оставил возврат на своем месте), что приводит к пропуску остальной части кода в блоке try и прыжка к блоку finally (не просто выходящему из содержащейся функции)), Exception прекратил происходит.

Следующие действия работают нормально:

...
Response.Clear();
...
...
try{
 if (something){
   Reponse.Write(...);

   return;

 } 

 some_more_code...

 Reponse.Write(...);

}
catch(Exception){
}
finally{
    Response.End();
}

Ответ 8

ошибка для Response.END(); потому что вы используете панель обновления asp или любой элемент управления, который использует javascript, попробуйте использовать собственный элемент управления из asp или html без javascript или scriptmanager или сценариев и повторите попытку

Ответ 9

Я удалил ссылку из UpdatePanel и также прокомментировал Response.End() Успех!!!

Ответ 10

Это не проблема, но это по дизайну. Основная причина описана на странице поддержки Microsoft.

Метод Response.End завершает выполнение страницы и переносит выполнение в событие Application_EndRequest в конвейере событий приложения. Строка кода, которая следует за Response.End, не выполняется.

Предоставленное решение:

Для Response.End вызовите метод HttpContext.Current.ApplicationInstance.CompleteRequest вместо Response.End, чтобы обойти выполнение кода в событие Application_EndRequest

Вот ссылка: https://support.microsoft.com/en-us/help/312629/prb-threadabortexception-occurs-if-you-use-response-end--response-redi

Ответ 11

Я рекомендую это решение:

  1. Не используйте response.End();

  2. Объявите этот глобальный var: bool isFileDownLoad;

  3. Сразу после вашего (response.Write(sw.ToString());) set ==> isFileDownLoad = true;

  4. Переопределите ваш рендер как:

    /// AEG : Very important to handle the thread aborted exception
    
    override protected void Render(HtmlTextWriter w)
    {
         if (!isFileDownLoad) base.Render(w);
    } 
    

Ответ 12

сбросить ответ клиенту перед ответом .end()

Подробнее о Response.Flush Method

Поэтому используйте код ниже response.End();

response.Flush();  

Ответ 13

Я использовал все вышеперечисленные изменения, но все же у меня была такая же проблема в моем веб-приложении.

Затем я связался с моим хостингом и попросил их проверить, не запрещается ли какое-либо программное обеспечение или антивирус блокировать наши файлы через HTTP. или ISP/сеть не позволяет передавать файл.

Они проверили параметры сервера и обходили "Общий брандмауэр центра обработки данных" для моего сервера, и теперь наше приложение может загрузить файл.

Надеюсь, что этот ответ поможет кому-то. Это то, что сработало для меня

Ответ 14

Я нашел причину. Если вы удалите панели обновления, он прекрасно работает!

Ответ 15

Правильный. Это хорошо работает для меня. заранее спасибо

Ответ 16

Я обнаружил, что следующее работает лучше...

   private void EndResponse()
    {
        try
        {
            Context.Response.End();
        }
        catch (System.Threading.ThreadAbortException err)
        {
            System.Threading.Thread.ResetAbort();
        }
        catch (Exception err)
        {
        }
    }