Asp.net http 处理程序文本文件下载问题。适用于代码隐藏
Posted
技术标签:
【中文标题】Asp.net http 处理程序文本文件下载问题。适用于代码隐藏【英文标题】:Asp.net http handler text file download issue. Works fine for codebehined 【发布时间】:2011-12-01 23:14:05 【问题描述】:最近我们遇到了使用 C# 4.0 开发的文件下载 http 处理程序的奇怪问题。
Web 应用程序使用 ASP.NET 4.0 开发并托管在 IIS 7.0 over ssl 上。它工作正常。但最近由于配置或网站的其他一些变化,我们面临下面列出的问题。
当我们下载文本文件时,它会发出垃圾数据。如果我在 aspx 页面上使用代码而不是处理程序,则相同的文件可以正常工作。两者都有相同的代码。一些文件工作正常。例如图像文件或 pdf 文件工作正常。但是对于文本文件,行为非常不一致。空白文本文件工作正常。我尝试比较两个响应(handler vs codebehind
),似乎返回的内容长度不一样。
context.Response.Clear();
context.Response.ClearHeaders();
context.Response.ClearContent();
context.Response.ContentType = !String.IsNullOrEmpty(mime) ? mime : "application/octet-stream";
context.Response.AppendHeader("Content-Disposition", String.Format("attachment; filename=0", fileName));
//context.Response.AppendHeader("Content-Length", buffer.Length.ToString());
context.Response.OutputStream.Write(buffer, 0, buffer.Length);
context.Response.End();
代码隐藏
HTTP/1.1 200 OK 服务器:ASP.NET Development Server/10.0.0.0 日期:周四, 2011 年 10 月 6 日 02:52:26 GMT X-AspNet-版本:4.0.30319 内容处置:附件;文件名=我的 junk.txt 缓存控制: 私有内容类型:文本/纯内容长度:29 连接:关闭
这只是样品测试
HTTPHANDLER
HTTP/1.1 200 OK 服务器:ASP.NET Development Server/10.0.0.0 日期:周四, 2011 年 10 月 6 日 02:54:04 GMT X-AspNet-版本:4.0.30319 内容处置:附件;文件名=我的 junk.txt 缓存控制: 私有内容类型:文本/纯内容长度:146 连接:关闭
��������
I�%&/m�J�J��t��
$ؐ@������iG#)���eVe]f@�흼��������;� N'����?\fdl��J�ɞ!���?~|?"�yѤ��N�l��͛6������ ������I� ��
【问题讨论】:
【参考方案1】:尝试使用AddHeader()
代替AppendHeader()
并在context.Response.End()
语句之前调用Flush()
。
【讨论】:
【参考方案2】:您可能想要做的另一件事是用引号将文件名括起来。当文件名中有逗号并认为有重复的响应头时,Chrome/Opera 无法正确处理此代码。
context.Response.AddHeader("Content-disposition", string.Format("attachment; filename=\"0\""), fileName);
有关详细信息,请参阅 here、here 和 here。
【讨论】:
以上是关于Asp.net http 处理程序文本文件下载问题。适用于代码隐藏的主要内容,如果未能解决你的问题,请参考以下文章
Asp.Net MVC (RC 5) 中的 404 Http 错误处理程序