我有两个非常相似的ASP.NET代码片段,它们将HTTP Reponse中的文件发送到客户端。它们应该使浏览器提示保存文件。第一个起作用,第二个起作用。 Fiddler中的HTTP响应如下所示。
工作:
HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 228108
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 4.0.30319
content-disposition: attachment; filename=Report.xlsx
Date: Wed, 05 Jan 2011 12:17:48 GMT
<binary data>
不工作:
HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 05 Jan 2011 12:19:21 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 228080
content-disposition: attachment; filename=report 2.xlsx
Cache-Control: private
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Connection: Close
<binary data>
当在Fiddler中看到第一个时,浏览器会正确提示保存文件。当在Fiddler中看到第二个时,浏览器中没有任何可观察的事件发生。 chrome和firefox中的行为相同。
知道为什么会这样吗?
编辑:产生第二个响应的ASP.NET代码
Response.Buffer = false;
Response.ContentType = @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AppendHeader("content-length", genstream.Length.ToString());
Response.AppendHeader("Content-Disposition", string.Format("attachment; filename={0}.xlsx", filename));
byte[] buffer = new byte[1024];
genstream.Position = 0;
int n;
while ((n = genstream.Read(buffer, 0, 1024) ) > 0)
{
Response.OutputStream.Write(buffer, 0, n);
}
答案 0 :(得分:1)
filename 参数值中的空格可能会导致此问题。请尝试quoted-string syntax:
Content-Disposition: attachment; filename="report\ 2.xlsx"
另见RFC 2183。
答案 1 :(得分:0)
问题出在这里:
Connection: Close
许多浏览器 - 特别是对于下载 - 使用100并继续读取标题并检查内容的长度。第二个不允许浏览器这样做。
这是因为这一行而生成的:
Response.Buffer = false;
删除它,它应该作为魅力!
答案 2 :(得分:0)
我真的有点惊讶第一个工作 - 我认为浏览器在HTTP标题中非常挑剔。
尝试将“content-disposition”标题更改为“Content-Disposition”。
答案 3 :(得分:0)
显然这不是响应的问题,而是请求的问题。 OP中的HTTP响应都是有效的,但生成第二个的页面上的链接位于asp ajax面板(UpdatePanel)中。我一直在盯着这个问题太长时间,并且对HTTP协议知之甚少,无法查看它的确切原因,但请求标题中的差异是这些字段:
工作(在ajax面板之外):
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
不工作(在ajax面板内):
X-Requested-With: XMLHttpRequest
X-MicrosoftAjax: Delta=true
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cache-Control: no-cache
Accept: */*
从ajax面板中删除链接后问题现在已经消失。 “连接:关闭”仍在(现在正在工作)标题中,因此显然与问题无关。
感谢您的帮助!