Asp.net http处理程序文本文件下载问题。适用于codebehined工作正常

时间:2011-10-06 03:11:13

标签: asp.net download httphandler

最近我们遇到了使用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开发服务器/ 10。0。0日期:星期四,星期四,   06 Oct 2011 02:52:26 GMT X-AspNet-Version:4.0.30319   内容 - 处理:附件; filename = my junk.txt Cache-Control:   private Content-Type:text / plain Content-Length:29 Connection:Close

仅用于样本测试

HttpHandler的

  

HTTP / 1.1 200 OK服务器:ASP.NET开发服务器/ 10。0。0日期:星期四,星期四,   06 Oct 2011 02:54:04 GMT X-AspNet-Version:4.0.30319   内容 - 处理:附件; filename = my junk.txt Cache-Control:   private Content-Type:text / plain Content-Length:146 Connection:Close

     

I�%&/m�{J�J��t�� $ @ IG#)的前夕F的@흼{{ ; N' ?\fdl J ɞ! ?〜|?“ yѤ N l ͛6 我

2 个答案:

答案 0 :(得分:0)

尝试使用AddHeader()代替AppendHeader(),并在Flush()声明之前调用context.Response.End()

答案 1 :(得分:0)

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

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

有关详细信息,请参阅hereherehere