【发布时间】:2012-07-10 21:03:49
【问题描述】:
过去几天我一直在尝试解决这个问题。我进行了详尽的 Google 搜索,尝试了许多解决方案,但都没有成功。
本质上,我正在尝试将数据导出到 CSV 并下载。该代码有效,但引发异常。我的特殊用法需要连续进行多次下载(如下例所示),但异常阻止了这种情况的发生。
string attachment = string.Format("attachment; filename={0}_OutPut.csv", companyName);
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.AddHeader("content-disposition", attachment);
HttpContext.Current.Response.ContentType = "text/csv";
HttpContext.Current.Response.AddHeader("Pragma", "public");
WriteColumnName("Column1,Column2,Column3");
StringBuilder stringBuilder = new StringBuilder();
foreach (Item i in list.Items)
{
AddData(i.TaxCodeValue.ToString(), stringBuilder);
AddData(i.Description.ToString(), stringBuilder);
AddData(i.Description.ToString(), stringBuilder);
stringBuilder.Length = 0; //Reset Stringbuilder value
HttpContext.Current.Response.Write(stringBuilder.ToString());
HttpContext.Current.Response.Write(Environment.NewLine);
}
HttpContext.Current.Response.End(); <---This is the problem
我读过:
http://support.microsoft.com/kb/312629
Alternative to Response.End()?
Thread was being aborted when exporting to excel?
我了解 Response.End() 正在引发异常,因为它正在中止线程(通常不建议)。但是,对于我的方案,我没有看到任何替代方案。
我尝试过的一些事情:
-
HttpContext.Current.ApplicationInstance.CompleteRequest();作为 Response.End() 的替代品。这会导致我的 CSV 被垃圾填满,而不是我正在写入的实际数据。 -
HttpContext.Current.Response.Redirect("Page.aspx", false);只是刷新页面,写入的数据没有下载。 - 在 catch 块中捕获异常。它总是设法逃脱并激起涟漪。
有什么想法吗?
提前谢谢你。
【问题讨论】:
-
多次下载是什么意思?一个文件有很多记录,还是一个文件一个接一个?
-
一个文件一个接一个地下载(换句话说,上面的代码在我的实际实现中针对不同的文件重复了几次)。
-
您在
Response.End()之前尝试过Response.Flush()吗?顺便说一句,我不确定您能否在一个响应中发送多个文件。 -
是的,我做到了。我不是想在一个响应中发送多个文件——只想下载多个文件,每个文件都有自己的响应。
-
companyName和list来自哪里?页面上的一些动态数据,或者可以通过查询字符串参数确定的东西?我问是因为您应该使用通用处理程序而不是页面对象来进行此类操作。
标签: c# asp.net multithreading