2010-07-08 141 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