ASP.Net MVC FilePathResult在IE中失败

时间:2010-02-02 07:49:28

标签: asp.net-mvc internet-explorer

我有一个控制器动作,它返回一个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”

1 个答案:

答案 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标头。删除此标题可以解决问题。