У меня есть две очень похожие части кода ASP.NET, которые отправляют файл в ответ HTTP для клиента. Они должны заставить браузер предлагать сохранить файл. Первый работает, второй нет. Ответы HTTP, как видно из Fiddler, приведены ниже.
Рабочая:
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);
}