2010-07-08 135 views
2

我們在使用window.open調用獲取Word文檔在IE7/IE8中下載時出現問題。這個問題目前僅在我們的生產環境中發生,且SSL啓用 - 我們的測試環境正常工作,但未啓用SSL。這兩個環境都運行IIS6並使用集成身份驗證。用window.open下載的Word文檔沒有打開(IE7/IE8)

的JavaScript是很簡單:

function OpenNewWindow(sURL, sName, sHeight, sWidth) 
{ 
    var sFeatures = "top=40,left=190,toolbar=no,location=no,directories=no,menubar=no,scrollbars=yes,resizable=yes,status=no"; 
    sFeatures = "width=" + sWidth + ",height=" + sHeight + "," + sFeatures; 

    var newWindow = window.open(sURL, sName, sFeatures); 
    newWindow.focus(); 
} 

上述功能被傳遞相對路徑,和頁面本身(ASP.NET頁面)是預格式化的HTML。該頁面的代碼隱藏功能將內容類型設置爲「application/msword」,並允許ASP.NET將頁面內容寫入輸出流。

當上述函數被調用時,會創建一個新窗口,然後立即關閉而沒有任何錯誤或提示。據我所知(使用Fiddler)啓用緩存並且HTTP壓縮未啓用。實際的文檔內容被返回,但IE和Word之間似乎存在某種斷開。

我注意到的一個古怪的問題是,在測試中存在一個協商挑戰,並在生產過程中用Kerberos票據進行響應,而沒有發生挑戰/響應(儘管在開始頁面上出現了一個,並且響應是NTLM )。另外,有問題的頁面(Word文檔)的直接鏈接確實可以在兩種環境中正常工作。最後,取消選中.DOC文件類型的「確認後下載」選項可以成功打開文檔(但不是我們願意爲2000多名員工開發的解決方案)。

我知道這是有限的信息,我可能需要添加更多的細節,但我花了一天的搜索/測試的更好的一部分,並沒有更接近解決這個問題。任何幫助將不勝感激!

接頭兩個環境:

TEST請求(正常工作,沒有SSL)
GET /webapps/gfcse/CSEPrint.aspx?mode=ReadOnly & sSurveyId = 3060 HTTP/1.1
接受: /
接受語言:EN-US
UA-CPU:86
接受編碼:gzip,緊縮
的User-Agent:Mozilla的/ 4.0(兼容; MSIE 7.0;風新臺幣5.1; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; OfficeLiveConnector.1.3; OfficeLivePatch.0.0)
主機:pc55516svma
連接:保持活動
曲奇:ASP.NET_SessionId = elto5pakakvepbju42w24eef
授權:協商[剪斷]

TEST響應
HTTP/1.1 200 OK
Cache-Control:private
Content-Length:26458
Content-Type:application/msword; charset = utf-8
服務器:Microsoft-IIS/6.0
X-Powered-by-ASP.NET
MicrosoftSharePointTeamServices:12.0.0。6421
WWW身份驗證:協商[剪斷]
X-ASPNET-版本:2.0.50727
日期:星期四,2010年7月8日15點14分26秒GMT

[文件內容]

生產請求(不工作,使SSL)
GET /gfcse/CSEPrint.aspx?mode=ReadOnly & sSurveyId = 3582 HTTP/1.1
接受:/
接受蘭用戶代理程序:Mozilla/4.0(兼容版本):en-us
UA-CPU:x86
接受編碼:gzip,deflate
User- MSIE 7.0; Windows NT 5.1; InfoPath.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; OfficeLiveConnector.1.3; OfficeLivePatch.0.0)
主機:intranet.gfnet.com
連接:保持活動
曲奇:ASP.NET_SessionId = h2xw0ebweb4e2455iab1tvbf

PRODUCTION響應
HTTP/1.1 200 OK
緩存控制:私人
內容長度:26438
內容類型:application/msword;字符集= UTF-8
服務器:Microsoft-IIS/6.0
MicrosoftSharePointTeamServices:12.0.0.6219
X供電,通過:ASP.NET
X-ASPNET-版本:2.0.50727
日期:週四,08 2010年7月15時07分41秒GMT

[文件內容]

+0

@ user387121我從來沒有用過ASP..but我嚴重懷疑它有什麼用javascript和有更多做頭正在發送:你見過這些網頁: http://support.microsoft.com/kb/316431 http://www.robpoyntz.com/blog/?p=245 (是PHP,但標題的東西仍然適用)。 – Jack 2010-07-08 21:01:51

+0

我以前見過微軟的知識庫文章,但沒有看到PHP面向PHP的文章。 – 2010-07-09 12:18:57

回答

4

問題,事實證明,與標題無關,而是我們試圖通過JavaScript做的事情 - 自動下載文件。

由於我們的測試和生產環境處於不同的安全區域,因此存在影響文件下載的不同設置(特別是「文件下載的自動提示」)。由於我們試圖在啓用了信息欄的區域中通過JavaScript下載文件,因此瀏覽器正在做它應該做的事情。有幾種不同的方法可以解決這個問題(即組策略,downloa

類似的問題在這個線程解決:IE7 issue - cannot download streamed file when Automatic prompting for file downloads is disabled

0

我想你會發現這是不是真的做JavaScript的問題,更多的IE瀏覽器和HTTP標頭的問題。我們有一個類似的問題,試圖打開CSV文件不同組合的標頭將正常工作其他人不會。我不能記住哪些是必要的,這些是我們最終必須設置

注意這是在PHP中,但你應該能夠轉化爲.NET

setHeader("Expires", gmdate("D, d M Y H:i:s") . " GMT") 
setHeader("Last-Modified", gmdate("D, d M Y H:i:s") . " GMT") 
setHeader("Cache-Control", "", true) 
setHeader('Content-Disposition', 'attachment; filename=' . $filenameToReturn) 
setHeader('Content-type', 'application/octet-stream') 
setHeader("Content-length", sprintf('%d', filesize($this->view->filename))); 

現在,我思考的問題是與Cache-Control頭,而且它必須是空

+0

在上面的代碼中: setHeader(「Cache-Control」,「」,true) 基本上是使用zend框架強制Cache-Control爲空,因爲在php中使用會話時會自動設置Cache-Control:no -cache,所以需要重寫並將其設置爲空值。可能不是asp.net中的問題 – Okeydoke 2010-07-08 21:06:15

+0

如果在通過window.open下載文件時不是問題,我會購買「不是JavaScript問題」的迴應。由於兩個環境之間的標頭實際上是相同的(唯一顯着的區別是在生產中缺少授權質詢/響應)並且文檔實際上已經返回,所以我想知道爲什麼使用window.open和一個錨元素。 這個問題似乎是IE在下載文檔後會做的事情,而修復「文檔未被緩存」問題的常規解決方案不起作用。 – 2010-07-09 12:27:32

0

您可以使用System.Web.HttpResponse強制必須從下載的文件用戶的瀏覽器。

Protected Sub btnDownloadMe_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnDownloadMe.Click 



    Dim filename As String = "demo.docx" 

    'For old version of MS Word use application/msword 

    Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document" 
    Response.AddHeader("Content-Disposition", String.Format("attachment;filename={0}", filename)) 
    Response.[End]() 


End Sub 
+0

將內容處置更改爲附件是我想到的事情,但我沒有時間去試用昨天。我今天可能會試試看看會發生什麼;) – 2010-07-09 13:40:06