Я попытался преобразовать свой набор данных в Excel и загрузить этот Excel. Я получил требуемый файл Excel. Но System.Threading.ThreadAbortException возникала при каждой загрузке Excel. Как решить эту проблему? .. Помогите, пожалуйста ...
Я вызываю этот метод на моем экране aspx. Он также вызывает такое же исключение.
Я вызываю эту общедоступную функцию void ExportDataSet (DataSet ds) на многих экранах aspx, а также поддерживаю метод регистрации ошибок для исключений, которые возникают во время выполнения, и эти исключения записываются в файлы .txt. То же самое исключение регистрируется во всех текстовых файлах экрана aspx. Я просто хочу, чтобы это исключение не генерировалось из файла класса, объявленного методом, в 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
{
}
}
Response.End
см. Stackoverflow.com/a/3917180/2864740 (и другие ответы); обратите внимание, что исключение «ожидаемо», поскольку именно так раскручивается стек (так что не перехватывайте это исключение). Если вы по-прежнему хотите перехватывать [другие] исключения, используйте:.. catch (ThreadAbortException) { throw; /* propagate */ } catch (Exception ex) { .. }
Ответы:
Я исследовал в Интернете и увидел, что
Response.End()
всегда выдает исключение.Замените это:
HttpContext.Current.Response.End();
С этим:
источник
Response.End()
это не работает, почему предложенный ответ имеет такжеResponse.End()
в последней строке? Вместо этого помогает ответ от @Binny (ниже)!Это помогло мне обработать
Thread was being aborted
исключение,если вы используете следующий код вместо
HttpContext.Current.Response.End()
, вы получитеServer cannot append header after HTTP headers have been sent
исключение.Надеюсь, поможет
источник
Response.End()
не работает, но предлагаемый метод тожеResponse.End()
в последней строке?Похоже на тот же вопрос, что и:
Когда вызывается ASP.NET System.Web.HttpResponse.End (), текущий поток прерывается?
Так что это задумано. Вам нужно добавить уловку для этого исключения и изящно «игнорировать» его.
источник
Переместите Response.End () за пределы блоков Try / Catch и Using.
Предполагается, что было выбрано исключение, чтобы обойти остальную часть запроса, вы просто не могли его поймать.
источник
Просто положите
внутри блока finally, а не внутри блока try.
Это сработало для меня !!!.
У меня была следующая проблемная (с исключением) структура кода
и это вызывает исключение. Я подозреваю, что исключение возникает там, где есть код / работа для выполнения после response.End (); . В моем случае дополнительный код был просто самим возвратом.
Когда я просто переместил response.End (); в блок finally (и оставил return на своем месте - что приводит к пропуску остальной части кода в блоке try и переходу к блоку finally (а не только к выходу из содержащей функции)) исключение перестало иметь место.
Следующее работает нормально:
источник
Используйте специальный блок для улова , за исключением Response.End () метод
Или просто удалите Response.End (), если вы создаете обработчик файлов
источник
У меня работает только
https://stackoverflow.com/a/21043051/1828356
источник
Я удалил кнопку ссылки из UpdatePanel, а также прокомментировал Response.End () Success !!!
источник
ошибка Response.END (); потому что вы используете панель обновления asp или любой элемент управления, использующий javascript, попробуйте использовать собственный элемент управления из asp или html без javascript или scriptmanager или сценариев и повторите попытку
источник
Это не проблема, но это сделано специально. Основная причина описана на странице поддержки 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
источник
сбросить ответ клиенту перед response.end ()
Подробнее о методе Response.Flush
Поэтому используйте приведенный ниже код перед
response.End();
источник
Я использовал все вышеупомянутые изменения, но все же у меня возникала такая же проблема в моем веб-приложении.
Затем я связался со своим провайдером хостинга и попросил их проверить, не блокирует ли какое-либо программное обеспечение или антивирус наши файлы для передачи через HTTP. или Интернет-провайдер / сеть не разрешает передачу файла.
Они проверили настройки сервера и обошли «общий брандмауэр центра обработки данных» для моего сервера, и теперь наше приложение может загрузить файл.
Надеюсь, этот ответ кому-то поможет. Это сработало для меня.
источник
Я нашел причину. Если вы удалите панели обновления, все работает нормально!
источник
Я рекомендую это решение:
Не использовать
response.End();
Объявите эту глобальную переменную:
bool isFileDownLoad;
Сразу после твоего
(response.Write(sw.ToString());) set ==> isFileDownLoad = true;
Переопределите свой рендер, например:
источник
Я обнаружил, что следующее работает лучше ...
источник
Мне помогло зарегистрировать кнопку, которая вызывает код за кодом в качестве элемента управления обратной передачей.
источник