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中的HTTP模块和处理程序(上)

ASP.Net 资源文件

字符串返回 asp.net 的 HTTP 处理程序

Asp.Net MVC (RC 5) 中的 404 Http 错误处理程序

将处理程序添加到 ASP.NET Core 中的默认 http 客户端 [重复]

asp.net中使用jquery ajax保存富文本的问题