У меня есть 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, и я не могу понять, какое сообщение об ошибке выдается.





Исключение ThreadAbortException создается из следующей строки:
HttpContext.Current.Response.End();
Вот еще подробности и обходной путь.
Выполнение кода всегда будет входить в блок finally, даже если не было сгенерировано исключение.
Если вы хотите обрабатывать другие исключения, просто добавьте предложение catch (Exception ex).
Исключение было вызвано 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
Пробовал использовать HttpContext.Current.ApplicationInstance.CompleteRequest. Он действительно работал, но также экспортировал полный HTML-код страницы в конце загруженного файла, что было нежелательно.
Response.BuffferOutput = True;
Response.Flush();
Response.Close();
Затем, после адских усилий, я наткнулся на приведенный выше код. И он работает отлично, без каких-либо исключений или нежелательного кода в конце загруженного файла.
Спасибо Viral за вашу помощь. Это сработало для меня. Спасибо за экономию времени. Вместо response.end () я написал следующие 3 строки: Response.BuffferOutput = True; Response.Flush (); Response.Close ();
У меня здесь была другая история, я использую элементы управления 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);
}
Это просто, вы можете попробовать:
Response.Close(); вместо Response.End();
Я внес изменение, но теперь оно просто переходит в блок finally, и я не могу понять, в чем проблема.