Asp.net http 处理程序文本文件下载问题。适用于代码隐藏

发布于 2024-12-08 07:18:15 字数 1516 浏览 0 评论 0原文

最近,我们在使用 C# 4.0 开发的文件下载 http 处理程序中遇到了奇怪的问题。

Web 应用程序使用 ASP.NET 4.0 开发,并通过 ssl 托管在 IIS 7.0 上。它工作正常。但最近由于配置或网站中其他地方的一些变化,我们面临着下面列出的问题。

当我们下载文本文件时,它会发出垃圾数据。如果我在 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 内容处置:附件;文件名=我的垃圾.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 内容处置:附件;文件名=我的垃圾.txt 缓存控制: 私人内容类型:文本/纯内容长度:146 连接:关闭

��������I�%&/m�{J�J��t��$�@������iG#)���eVe]f@�흼��{���{���;�N'���?\fdl��J�ɞ!���?~|?"�yѤ��N�l ��͛6������������我���

Recently we are encountering strange issue with file download http handler developed using C# 4.0.

The web application is developed using ASP.NET 4.0 and hosted on IIS 7.0 over ssl. It worked correctly. But recently due to some changes else where in config or website we are facing the issue listed below.

When we download the text file it emits junk data. The same file works fine if i use code behind on aspx page instead of handler. Both have same code. Some of the files works fine. for e.g. image file or pdf file works fine. But with text file the behavior is very inconsistent. Blank text file works fine. I tried comparing the two responses (handler vs codebehind) and it seems that content-length returned is not same.

    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();

CODE BEHIND

HTTP/1.1 200 OK Server: ASP.NET Development Server/10.0.0.0 Date: Thu,
06 Oct 2011 02:52:26 GMT X-AspNet-Version: 4.0.30319
Content-Disposition: attachment; filename=my junk.txt Cache-Control:
private Content-Type: text/plain Content-Length: 29 Connection: Close

This is for sample test only

HTTPHANDLER

HTTP/1.1 200 OK Server: ASP.NET Development Server/10.0.0.0 Date: Thu,
06 Oct 2011 02:54:04 GMT X-AspNet-Version: 4.0.30319
Content-Disposition: attachment; filename=my junk.txt Cache-Control:
private Content-Type: text/plain Content-Length: 146 Connection: Close

��������I�%&/m�{J�J��t��$ؐ@������iG#)���eVe]f@�흼��{���{���;�N'���?\fdl��J�ɞ!���?~|?"�yѤ��N�l��͛6������ ������I���

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

白芷 2024-12-15 07:18:15

尝试使用 AddHeader() 而不是 AppendHeader() 并在 context.Response.End() 之前调用 Flush()代码>声明。

Try to use AddHeader() instead of AppendHeader() and invoke Flush() before context.Response.End() statement.

孤寂小茶 2024-12-15 07:18:15

您可能想做的另一件事是将文件名用引号引起来。当文件名中包含逗号并认为存在重复的响应标头时,Chrome/Opera 无法正确处理此代码。

context.Response.AddHeader("Content-disposition", string.Format("attachment; filename=\"{0}\""), fileName);

请参阅此处此处,以及 此处了解更多信息。

Another thing you may want to do is surround the file name in quotes. Chrome/Opera do not handle this code correctly when the file name has a comma in it and think there are duplicate response headers.

context.Response.AddHeader("Content-disposition", string.Format("attachment; filename=\"{0}\""), fileName);

See here, here, and here for more information.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文