Как избежать 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();
Надеюсь, что это поможет
Ответ 3
Возникает тот же вопрос, что и:
Когда вызывается ASP.NET System.Web.HttpResponse.End(), текущий поток прерывается?
Так это по дизайну. Вам нужно добавить catch для этого исключения и изящно "игнорировать" его.
Ответ 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();
Ответ 6
Только для меня работает
HttpContext.Current.ApplicationInstance.CompleteRequest().
fooobar.com/questions/89048/...
Ответ 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
Я рекомендую это решение:
-
Не используйте response.End();
-
Объявите этот глобальный var: bool isFileDownLoad;
-
Сразу после вашего (response.Write(sw.ToString());) set ==> isFileDownLoad = true;
-
Переопределите ваш рендер как:
/// 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)
{
}
}