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

MALCMATMNP06 似乎是 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' 登录失败”

windows server 2012 r2 iis8.5 部署 asp.net 网站

使用前端 ASP.net 从 Access db 迁移到 SQL Server 2008