使用ASP.NET MVC在Internet Explorer中“无法下载文件”

时间:2012-03-07 22:03:49

标签: asp.net-mvc internet-explorer filecontentresult

所以我从这样的动作中返回FileContentResult

return File(pck.GetAsByteArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "MyExcelFile.xlsx");

在IE中单击“打开”(我使用的是IE9,版本9.0.8112.16421)时,会显示“无法下载文件”,并向用户显示“重试”按钮。如果他们单击“重试”,则可以正常工作。如果他们单击“保存”,则工作正常。在Firefox中,它工作正常。

如何在第一次点击打开时允许用户打开文件?

4 个答案:

答案 0 :(得分:2)

我能够通过修改URL“欺骗”IE做正确的事情。这有点像hacky,但这里有细节。 HTH。

作为一名优秀的MVC编码器,我使用Url.Action()在我的视图中为我的控制器动作生成正确的链接。结果是“/ Subscription / DownloadArchive”,我遇到了同样的问题。 (我正在流式传输一个ZIP文件,但它似乎与你的CSV没什么不同。)刚才一时兴起,在阅读你的帖子之后,我将URL硬编码为“/Subscription/DownloadArchive/Archive.zip”。我忽略了代码中的“Archive.zip”,但这实际上是我从控制器的动作返回的文件名。

的Presto!

答案 1 :(得分:2)

我遇到了同样的问题而无法提供一个好的解决方案(除了Tood建议, 一个选项)。但是用小提琴手观察情况我有一些可能有帮助的信息。

我们的应用程序即时创建PDF文档并将其作为下载提供。这个问题显然与数据有关,这意味着一些生成的文件在第一次尝试时下载得很好,而其他文件则可以重复进行重试。

据我所知,Fiddler显示每次访问时服务器响应都是相同的。但是请求有所不同(样本略有编辑):

第一次请求:

GET http://localhost:12345/Item/PDF/id HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: ...
Accept-Language: ...
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Host: localhost:12345
Connection: Keep-Alive
Cookie: ASP.NET_SessionId=52znkt1fcisrolj44tnuyzu4

第二次请求:

GET http://localhost:12345/Item/PDF/id HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Host: localhost:12345
Connection: Keep-Alive
Cookie: ASP.NET_SessionId=52znkt1fcisrolj44tnuyzu4

请注意,第二个请求如何将“Accept:”标头缩减为*/*。我不愿意向Url添加文件扩展名的原因是建议的下载名称是根据项目数据生成的,与响应一起提交,否则与ID完全无关。

答案 2 :(得分:0)

我遇到了同样的问题但是如果我将Visual Studio Development Server的端口号更改为另一个,那么这个问题就消失了。

答案 3 :(得分:0)

这有效..

Response.Clear();
Response.ClearHeaders();
Response.ClearContent(); 
Server.ScriptTimeout = 3000;
Response.AppendHeader("Content-Disposition:", "attachment; filename=" + fileName);
Response.ContentType = "application/x-msdownload";
excelFile.SaveXls(Response.OutputStream);  
Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();
// Response.Close();
Response.End();