我在生产服务器上的IE 10中的ASP.NET / VB Web窗体应用程序(以.NET 2.0为目标)中的Response.WriteFile方法存在问题(我认为)。基本上,这个代码已经到位并且已经运行了很多年,直到IE 10.现在,当我通过Visual Studio在本地测试它时它工作正常,但是当它在生产服务器上时(Server 2008 R2,IIS 7),我收到一个无法下载文件的错误。当我强迫它时,我得到一个损坏的PDF。我正在使用Crystal Reports X生成PDF。任何愿意帮助我研究这个问题的人都会得到我不懈的感激!我尝试了各种各样的IE 10的所有compat模式。我已根据Scott Hanselman http://www.hanselman.com/blog/BugAndFixASPNETFailsToDetectIE10CausingDoPostBackIsUndefinedJavaScriptErrorOrMaintainFF5ScrollbarPosition.aspx更新了我的App_Browsers文件夹中的浏览器定义文件。作为一个相对较新的开发人员,我不确定我在IE 10上如何通过VS工作,但在我投入生产时不起作用。
以下是相关代码段:
...
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=ThisReport_" & Server.UrlEncode(Me.ReportName.Text & "_" & Now.Month.ToString() & "_" & Now.Day.ToString() & "_" & Now.Year.ToString()) & ".pdf")
Response.WriteFile(strFileName)
...
提前感谢您在解决此问题时提供的任何帮助,指导或指导。我在我的应用程序的许多地方都有这个,所以找到一个根级别的修复程序比将它固定在它出现的每个地方都要好。不幸的是,升级到.NET 4.5目前不是一种选择。
答案 0 :(得分:4)
我正在回答我自己的问题,以防可能后来遇到的其他人可以从中受益。事实证明,据我所知,IE 10中的一个变化会影响ASP.NET 2.0(或其他版本中的响应对象,我不确定)。我能够通过添加......来解决我的问题。
Response.ClearContent()
Response.ClearHeaders()
Response.Clear()
Response.Buffer = True
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=ThisReport_" & Server.UrlEncode(Me.ReportName.Text & "_" & Now.Month.ToString() & "_" & Now.Day.ToString() & "_" & Now.Year.ToString()) & ".pdf")
Response.WriteFile(strFileName)
Response.End()
我尝试使用
Response.Flush()
Response.Close()
当我这样做时,我正在将HTML页面吐出而不是PDF内容。这已经解决了我的问题,尽管我还有很多关于ASP.NET和IIS的内部工作原理,我还没有学习。如有必要,请随意添加。
答案 1 :(得分:0)
替换Response.Flush() 和Response.Close()与HttpContext.Current.ApplicationInstance.CompleteRequest()
答案 2 :(得分:0)
我遇到了同样的问题,它在我的本地机器上工作,但没有在PROD服务器上工作,因为我认为我的本地机器可能从Microsoft和PROD服务器获得更新尚未更新。我们正在测试的应用程序运行良好在IE兼容模式下,但在IE 10中获得各种奇怪的东西。
我要求使用2年前由Microsoft发布的hotfix更新prod服务器。但我的服务器上有2.0框架,所以我让他们转到框架3.5并应用此修复程序。现在应用程序运行正常,我可以使用而无需将浏览器模式更改为IE 10兼容模式。
以下是修复
的链接http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=2600088&kbln=en-us
答案 3 :(得分:0)
我遇到了同样的问题。我正在使用Response.Close(),我将其替换为" Response.End()"它只是完成了这项工作。