我有一个带有Web API的ASP.NET MVC 4应用程序。它工作得很好。但有一个问题是IE无法从web api下载文件,而chrome和firefox可以。浏览器说
"Unable to open this internet site. The requested site is either unavailable or cannot be found."
根据IE 8 and client-side caching,看起来无缓存设置会导致问题。所以我想在该下载中设置私有缓存。但是在MVC 4中,我发现HttpResponseMessage中没有属性“Cache”,也没有设置私有缓存的方法。有人能说明怎么做吗?
更新1:根据我的调试,它不是缓存,而是以下代码中的“ContentDisposition”。
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(result);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.ms-excel");
// response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
// {
// FileName = "PY75.xls"
// };
return response;
如果我像上面那样评论,IE可以下载id为默认文件名的文件,但在上面取消注释时它不能像上面描述的那样。知道如何解决这个问题吗?为什么IE无法识别内容处置标题?
更新2:升级IE 9后,内容处理终于正常工作,可以从web api下载。
答案 0 :(得分:2)
尝试添加
response.AddHeader("Content-Disposition", "attachment; filename=PY75.xls");
<强>更新强>
我更多地考虑了这一点,这可能是你打开和关闭你的流的方式的结果(不确定没有看到其余的代码。我尝试了以下,它对我有用,也许它会工作为你服务!
public HttpResponseMessage Get()
{
string path = @"PATH_TO_XLS";
MemoryStream responseStream = new MemoryStream();
using (Stream fileStream = File.Open(path, FileMode.Open))
{
fileStream.CopyTo(responseStream);
fileStream.Close();
}
responseStream.Position = 0;
HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(responseStream);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "PY75.xls" };
return response;
}
我唯一注意到浏览器会出现问题的时候是在发送响应之前关闭内存流的时候,这是有意义的,因为内存流必须打开才能将内容流回客户端。但是我注意到所有浏览器上的问题不仅仅是IE。我不确定你的代码的其余部分是如何处理的,但是如果你例如处理为chunked http创建流的方式与仅发送可能导致它的整个文件的对比。
答案 1 :(得分:2)
我遇到了类似的问题并发表了关于我的解决方案的博文here 解决方案的要点是,在使用HTTPS时,Pragma = no-cache标头会导致IE 9及以下版本的下载失败。所以你基本上必须去掉那个标题。此外,如果有一个显式的Cache-control标头,并且它的值应为no-store,则no-cache也会导致下载失败。