s-s-rS2008 ASP.NET ServerReport 在 IE11 上使用 OEM UserAgent 失败
Posted
技术标签:
【中文标题】s-s-rS2008 ASP.NET ServerReport 在 IE11 上使用 OEM UserAgent 失败【英文标题】:s-s-rS2008 ASP.NET ServerReport fails on IE11 with OEM UserAgent 【发布时间】:2014-01-02 15:06:43 【问题描述】:我正在使用 SQL Server Report Service 2008 将 s-s-rS ServerReport 渲染为 PDF 并在 ASP.NET 3.5 应用程序的 ReportViewer WebForm 控件中。
一些使用 Internet Explorer 11 的用户报告说他们无法打开生成的 PDF 文件或在查看器中查看任何内容。 渲染失败并出现此错误:
library!ReportServer_0-403!7c8!01/02/2014-11:07:37:: e ERROR: Throwing Microsoft.ReportingServices.Diagnostics.Utilities.InternalCatalogException: , Microsoft.ReportingServices.Diagnostics.Utilities.InternalCatalogException: Interner Fehler beim Berichtsserver. Weitere Informationen finden Sie im Fehlerprotokoll. ---> System.ArgumentNullException: Value cannot be null.
Parameter name: String
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.Web.Configuration.HttpCapabilitiesBase.get_MajorVersion()
at Microsoft.ReportingServices.Diagnostics.Utilities.BrowserDetectionUtility.GetBrowserInfoFromRequest(HttpRequest request)
at Microsoft.ReportingServices.Diagnostics.RSRequestParameters.SetBrowserCapabilities(HttpRequest request)
at Microsoft.ReportingServices.Library.RenderReportAction.SetBrowserCapabilities()
at Microsoft.ReportingServices.Library.RenderReportAction.PerformExecution()
at Microsoft.ReportingServices.Library.RenderReportAction.Render()
--- End of inner exception stack trace ---;
我可以将这些错误追溯到 IE11 的 UserAgent 中使用的 OEM 字符串。
例子:
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; MALC; rv:11.0) like Gecko
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; MATM; rv:11.0) like Gecko
Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; NP06; rv:11.0) like Gecko
MALC、MATM 和 NP06 似乎是 OEM 字符串,不是通常的 IE11 UserAgent 的一部分。 在 IE 开发者工具用户代理设置中删除这些字符串可以使一切正常工作,但不是最终用户的解决方案。
我尝试过的事情:
在 ASP.NET 应用程序中覆盖传入请求的 UserAgent,但无论我设置什么,它似乎都不会改变。 (我可能做错了,我发现我无法改变它所以我还是尝试了) 覆盖 Global.asax 中 Begin-/EndRequest 事件的标头 在应用程序本身的 App_Browser 目录和 s-s-rS 服务器应用程序上添加自定义 .browser 文件有什么作用:
拦截请求并使用具有不同 UserAgent 的 HttpWebRequest 发出自定义请求,来回复制 cookie(会话 ID)和请求/响应标头。我觉得这是一个糟糕的解决方案,不应该这样做。
如何让 s-s-rS 在解析 IE11s UserAgent 时不抛出错误? 有没有办法禁用它或添加自定义正则表达式来手动解析它?
【问题讨论】:
【参考方案1】:您可以通过提供其他设备信息来覆盖报表服务器的用户代理。
这可以在调用 SOAP API 的 Render 方法时通过提供此 XML 片段作为参数来完成
<DeviceInfo>
<UserAgent>custom_user_agent_here</UserAgent>
</DeviceInfo>
或者像这样使用 URL 访问
http://<Server Name>/reportserver?/SampleReports/Sales Order Detail&rs:Command=Render&rs:Format=html4.0&rc:UserAgent=custom_user_agent_here
.
参考文献
Reporting Services 设备信息设置 http://msdn.microsoft.com/en-us/library/ms155397(v=sql.110).aspx
HTML 设备信息设置 http://msdn.microsoft.com/en-us/library/ms155395(v=sql.110).aspx
【讨论】:
以上是关于s-s-rS2008 ASP.NET ServerReport 在 IE11 上使用 OEM UserAgent 失败的主要内容,如果未能解决你的问题,请参考以下文章
无法连接到远程服务器 - s-s-rS 2008 - webservice
SQL Server 2008 R2 / s-s-rS 2008:服务水平报告创建
在 asp.net 中的 windows server 2008 R2 上的 PDF 缩略图
ASP.NET 和 SQL Server 2008 中的错误“用户 'NT AUTHORITY\IUSR' 登录失败”