我有一个控制器动作,它返回一个pdf文档。根据站点切换变量,它将选择多个源文件中的一个,重命名并将其返回给浏览器。这适用于Chrome和Firefox,但在IE8上,会出现下载对话框,然后出现以下错误消息框...
“Internet Explorer无法下载 来自的FullTermsAndConditions www.mydomain.com。
Internet Explorer无法打开 这个互联网网站。请求的网站 要么不可用,要么不能 找到。请稍后再试。“
这是我的代码......
public ActionResult FullTermsAndConditions()
{
var targetFileName = LookupTargetFileName();
var fullPath = System.IO.Path.Combine(DownloadsPath, LookupSourceFileName());
var result = File(fullPath, "application/pdf");
result.FileDownloadName = targetFileName;
return result;
}
谁能看到我做错了什么?
更多信息......
我将以下代码添加到控制器中以查看标题...
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
WriteResponseHeadersToFile(@"C:\temp\ResponseHeaders.txt", filterContext.HttpContext.Response);
}
private static void WriteResponseHeadersToFile(string fileName, System.Web.HttpResponseBase response)
{
using (StreamWriter writer = new StreamWriter(fileName, true))
{
writer.Write("Reponse started @ ");
writer.WriteLine(DateTime.Now.ToShortTimeString());
var allHeaders = response.Headers;
for (int i = 0; i < allHeaders.Count; i++)
writer.WriteLine("{0} = {1}", allHeaders.Keys[i], allHeaders[i]);
writer.Close();
}
}
这是结果......
响应开始@ 09:02
Server = Microsoft-IIS / 7.0
X-AspNetMvc-Version = 1.0
内容 - 处置=附件; filename =“完整条款和条件.pdf”
答案 0 :(得分:0)
成功!
问题出在客户端缓存上。我的一个父控制器类具有以下代码(试图阻止用户在退出后'返回')...
protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
base.OnResultExecuted(filterContext);
Response.Buffer = true;
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.ExpiresAbsolute = DateTime.Now.AddDays(-1d);
Response.Expires = -1500;
Response.Cache.SetETag(DateTime.Now.Ticks.ToString());
}
如果在IE8中,您正在下载的文件无法在浏览器中打开,它将尝试保存临时副本。这违反了no-cache标头。删除此标题可以解决问题。