2011-10-27 102 views
0

我有這段代碼:寫Word文檔在飛行

Response.AddHeader("Content-type", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
Response.AppendHeader("Content-disposition", "attachment; filename=Bio.docx"); 
Response.BinaryWrite(lawyerBio.MakeDoc()); 

它可以在所有主要瀏覽器就好了,但在IE8失敗。

什麼IE8正在做的是我第一次打的頁面,它給出了一個說:彈出錯誤:

Internet Explorer無法下載從「約翰·史密斯」「網站域名」。

Internet Explorer無法打開此Internet站點。 請求的網站不可用或無法找到。請稍後再試 。

如果我點擊確定,然後刷新頁面,它將下載文件就好了,文件名爲Bio.docx。它每次都是第一次失敗,而且每次都是第二次。 John-Smith是正在發生的頁面的文件名,因此它看起來好像是第一次通過,它沒有提取內容處置。

是否有任何已知的問題與IE8,或任何你們可以看到我做錯了什麼?

乾杯


更新

下面是這個文件發送的頭:

 Array 
(
    [0] => HTTP/1.1 200 OK 
    [1] => Cache-Control: no-cache, no-store 
    [2] => Pragma: no-cache 
    [3] => Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document 
    [4] => Expires: -1 
    [5] => Server: Microsoft-IIS/7.5 
    [6] => Set-Cookie: website#sc_wede=1; path=/ 
    [7] => Set-Cookie: website#lang=en; path=/ 
    [8] => Set-Cookie: ASP.NET_SessionId=zabhwz55brq0ebfyjqn1c3bm; path=/; HttpOnly 
    [9] => Content-Disposition: attachment; filename=Bio.docx 
    [10] => X-AspNet-Version: 2.0.50727 
    [11] => Set-Cookie: SC_ANALYTICS_GLOBAL_COOKIE=323F079A90B545F39F8A6A9EB9B919DB; expires=Fri, 26-Oct-2012 17:44:57 GMT; path=/ 
    [12] => Set-Cookie: SC_ANALYTICS_SESSION_COOKIE=118B88825A054BA1BAF327B0561C3EBB,1; path=/ 
    [13] => X-Powered-By: ASP.NET 
    [14] => Date: Thu, 27 Oct 2011 17:44:57 GMT 
    [15] => Connection: close 
    [16] => Content-Length: 169581 
) 
+2

您會注意到IE8沒有被加入「所有主流瀏覽器」;) –

+0

您使用的是SSL還是Cache-Control標頭? – Martey

+0

沒有SSL,但我會從FF Web Dev獲取頭文件的副本,並將它們附加到原始問題。 –

回答

0

我認爲問題是Cache-Control頭。請參閱MSKB #323308。儘管有標題,但我在網上發現了許多帖子,暗示不緩存下載文件可能會導致非SSL網站在Internet Explorer中失敗。我會嘗試添加知識庫文章建議的註冊表值BypassHTTPNoCacheCheck - 如果它能夠正常工作,則需要從響應中刪除緩存標頭。

+0

我認爲你是對的,但是我不能說服我的客戶在生產網絡服務器上搞砸他們的註冊表。任何想法如何通過代碼關閉它? –

+0

根據http://www.php.net/manual/en/function.header.php#99190,刪除Cache-Control和Pragma頭文件應該能夠解決這個問題。 – Martey

+0

接受這個答案,因爲這是爲什麼它失敗。如何解決這個問題要複雜得多,但我有一種感覺,就是IIS,C#和SiteCore之間的混亂 - 但這是我的解決方案特有的,而不是問題,這是其他人要搜索和查找的問題這個。 –

0

嘗試(而不是BinaryWrite)這個......(你總是可以互換MemoryStreamFileStream如果文件不是直接在磁盤上)。

  byte[] buffer = new byte[4096]; 
      using (Stream s = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 
      { 
       int bytes; 
       while ((bytes = s.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        Response.OutputStream.Write(buffer, 0, bytes); 
       } 
      } 
      Response.Flush(); 
+0

我試着用MemoryStream()運行這個,但仍然有相同的結果。 –

+0

嘗試在每次調用時更改文檔的名稱以查看它是否是緩存問題。而不是生物.docx使它''Guid.NewGuid()+「.docx」' – SliverNinja

+0

我已經實現了,IE8仍然認爲它在第一次運行約翰史密斯,然後在後續guid.docx。 –