过去几天我一直在尝试解决这个问题。我进行了详尽的 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 block 中捕获异常。它总是设法逃脱并激起涟漪。
有什么想法吗?
提前谢谢你。
最佳答案
当您像此处那样将文件输出到流时,您实际上必须“劫持”Page
的正常流。您应该改用通用处理程序(实现 IHttpHandler
的 .ashx 文件)。
实现通用处理程序时,您无需担心调用 Response.Clear
和 Response.End
,因为您将自己提供完整的响应。然后您的页面将有指向 ashx 处理程序的链接,传递必要的查询字符串参数以加载您的数据。
示例:您的页面将包含指向“/MyCsvDownload.ashx?CompanyID=11”的链接
您的项目将定义一个 HelperClass,声明 WriteColumnHeaders 和 AddData 静态方法,以及一个 MyCsvDownload.ashx,代码如下:
public class MyCsvDownload : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
var companyId = int.Parse(context.Request.QueryString["CompanyID"]);
string companyName;
ItemList list;
// TODO: Load company name and items from Company ID.
string attachment = string.Format("attachment; filename={0}_OutPut.csv", companyName);
context.Response.AddHeader("content-disposition", attachment);
context.Response.ContentType = "text/csv";
context.Response.AddHeader("Pragma", "public");
StringBuilder stringBuilder = new StringBuilder();
HelperClass.WriteColumnName("Column1,Column2,Column3", stringBuilder);
context.Response.Write(stringBuilder.ToString());
context.Response.Write(Environment.NewLine);
stringBuilder.Clear();
foreach (Item i in list.Items)
{
HelperClass.AddData(i.TaxCodeValue.ToString(), stringBuilder);
HelperClass.AddData(i.Description.ToString(), stringBuilder);
HelperClass.AddData(i.Description.ToString(), stringBuilder);
context.Response.Write(stringBuilder.ToString());
context.Response.Write(Environment.NewLine);
stringBuilder.Clear();
}
context.Response.Flush();
}
public bool IsReusable
{
get
{
return false;
}
}
}
关于c# - CSV 导出 Response.End 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11421908/