2010-02-02 64 views
0

我有一個控制器操作返回一個pdf文檔。根據站點切換變量,它將選擇多個源文件中的一個,將其重命名並將其返回給瀏覽器。這工作完全在Chrome和Firefox,但在IE8,出現下載對話框,然後在下面的錯誤消息框...ASP.Net MVC FilePathResult在IE中失敗

「Internet Explorer無法從 www.mydomain.com下載 FullTermsAndConditions。

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(); 
    } 
} 

這是結果...

Reponse started @ 09:02
Server = Microsoft-IIS/7.0
X-AspNetMvc-Version = 1.0
Content-Disposition = attachment; filename =「Full Terms and Conditions.pdf」

+0

什麼是'targetFileName'?你可以顯示'FullTermsAndConditions()'產生的HTTP響應頭嗎? – bzlm 2010-02-02 08:11:14

+0

targetFileName將是'FullTermsAndConditions.pdf',是用戶在下載時看到的名稱。 你能給我一個方法來檢查標題嗎? – 2010-02-02 08:28:28

+0

主要問題現在有更多的信息。 – 2010-02-02 09:04:46

回答

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,您正在下載該文件無法打開在瀏覽器中,它將嘗試保存臨時副本。這違反了無緩存頭。刪除此標題可解決問題。

+3

http://blogs.msdn.com/ieinternals/archive/2009/10/02/Internet-Explorer-cannot-download-over-HTTPS-when-no-cache.aspx – EricLaw 2010-02-02 15:37:37

+0

這是kb的文章版本:http: //support.microsoft.com/kb/316431 – 2012-02-09 19:17:20