C# SSRS2008 ASP.NET ServerReport在具有OEM UserAgent的IE11上失败
我正在使用SQL Server Report Service 2008将SSRS ServerReport呈现为PDF格式,并在ASP.NET 3.5应用程序的ReportViewer WebForm控件中呈现 一些使用Internet Explorer 11的用户报告说,他们无法打开生成的PDF文件或在查看器中看到任何内容。 渲染失败,出现以下错误:C# SSRS2008 ASP.NET ServerReport在具有OEM UserAgent的IE11上失败,c#,asp.net,reporting-services,ssrs-2008,internet-explorer-11,C#,Asp.net,Reporting Services,Ssrs 2008,Internet Explorer 11,我正在使用SQL Server Report Service 2008将SSRS 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 M
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用户代理。
在IEs developer tools用户代理设置中删除这些字符串可以使一切正常工作,但对最终用户来说并不是一个解决方案
我尝试过的事情:
在ASP.NET应用程序中重写传入请求的UserAgent,但无论我设置了什么,它似乎都不会更改。我可能做错了,但我发现我无法改变它,所以我还是尝试了
在Global.asax中的Begin-/EndRequest事件处重写标头
在应用程序本身的App_browser目录和SSRS服务器应用程序上添加自定义.browser文件
什么是有效的:
拦截请求并使用HttpWebRequest和其他UserAgent发出自定义请求,来回复制Cookie会话id和请求/响应头。
我觉得这是一个可怕的解决方案,不应该这样做
如何使SSRS在解析IE11s UserAgent时不抛出错误?
有没有办法禁用它或添加自定义正则表达式来手动解析它 您可以通过提供其他设备信息来覆盖报表服务器的用户代理 这可以在调用SOAP API的呈现方法时通过提供此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设备信息设置
HTML设备信息设置