2012-09-04 44 views
3

我有一個帶有Web API的ASP.NET MVC 4應用程序。它運作良好。但一個問題是,IE瀏覽器無法從網頁api下載文件,而Chrome和Firefox可以。瀏覽器說可以從Firefox和Chrome下載文件,但不在IE中

"Unable to open this internet site. The requested site is either unavailable or cannot be found." 

根據IE 8 and client-side caching,它看起來像no-cache設置導致問題。所以我想在該下載中設置私有緩存。但在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下載。

+1

IE9和IE10是否識別「content-disposition」標頭? –

回答

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瀏覽器。我不確定代碼的其餘部分如何處理它,但是例如,如果您爲分塊的http處理不同的流而創建流,而只發送可能導致它的整個文件。

+0

我也試過,沒有成功。不管怎麼說,還是要謝謝你。 –

2

我遇到了類似的問題,並在我的解決方案中發佈了博客here 解決方案的一個重要原因是Pragma = no-cache標頭導致下載在IE 9及其下的HTTPS時失敗。所以你基本上必須去掉那個標題。另外,如果有一個顯式的Cache-control頭,並且它的值應該是no-store,那麼no-cache也會導致下載失敗。

相關問題