SSRS 报告查看器 - 报告图表无法在 IE11 中显示
SSRS Report Viewer - Report chart fails to display in IE11
我有一个显示仪表盘麦粒肿报告的报告查看器控件。
它有几个图表来提供概览,但是在 IE11 中查看时,报告根本不会呈现,只是显示为空白。
底层存储过程也是 运行。
我做了一些测试
- 图表显示在 Firefox 中(当前)
- 图表显示在 Chrome(当前)
- 图表显示在 IE 兼容模式下。
- 如果我在网络查看器上使用 PDF 导出功能,它可以将原始字节流转换为带有图表的正确 PDF,这意味着报告 运行 正确。最初尝试显示报表时,基础存储过程仅 运行 一次。
我不确定这是否是 IE 与 webviewer 控件交互的方式的问题。
更新 - 借助 Fiddler 的魔力,在请求 blank.gif 时,看起来像是被吃掉了错误,但我相信这似乎是结果 gif 的占位符。
URL 中缺少 IterationId。
奇怪的是,查看 FireFox 和 Chrome 的 Fiddler 跟踪结果会出现关于 URL 中缺少的 IterationId 的相同错误,但图表仍然显示。我假设这仍然是问题所在。
请求header
GET /Reserved.ReportViewerWebControl.axd?ReportSession=....&Culture=1033
&CultureOverrides=True&UICulture=1033&UICultureOverrides=True
&ReportStack=1&ControlID=...
&OpType=ReportImage&ResourceStreamID=Blank.gif HTTP/1.1
文本回复
[HttpHandlerInputException: Missing URL parameter: IterationId]
Microsoft.Reporting.WebForms.HandlerOperation.GetAndEnsureParam(NameValueCollection urlQuery, String paramName) +104
Microsoft.Reporting.WebForms.ReportImageOperation.PerformOperation(NameValueCollection urlQuery, HttpResponse response) +102
Microsoft.Reporting.WebForms.HttpHandler.ProcessRequest(HttpContext context) +380
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +599
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +171
缺少的 IterationId 帮助我找到了类似的场景。 IterationId 在 IE11 中会像在 Chrome 和 Firefox 中一样失败是有道理的,因为 IE11 将自己介绍为 Mozilla 客户端。 "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
Devin Steinke 在 SQL Reporting Services - Viewer broken in Non-IE Browsers
上发表的这篇文章
在我的 Global.asax 后面的代码中,我仅在对 ReportViewerWebControl blank.gif 的请求中附加了 IterationId 参数。
它现在可以在 IE11 中使用,并且仍然可以在 FireFox、Chrome 和旧版本的 IE 中使用。
您不会再看到来自 fiddler 的异常,结果文本显示 GIF 的检索,"GIF89a" 在我的例子中。
VB.NET:
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
Dim pathQuery = HttpContext.Current.Request.Url.PathAndQuery
Dim url = HttpContext.Current.Request.Url.ToString().ToLower()
If pathQuery.StartsWith("/Reserved.ReportViewerWebControl.axd") And Not url.Contains("iteration") Then
Dim resourceStreamId = HttpContext.Current.Request.QueryString("ResourceStreamId")
If IsNothing(resourceStreamId) Then Return
If resourceStreamId.ToString().Equals("blank.gif", StringComparison.InvariantCultureIgnoreCase) Then
Context.RewritePath(String.Concat(HttpContext.Current.Request.Url.PathAndQuery, "&IterationId=0"))
End If
End If
End Sub
C#:
void Application_BeginRequest(object sender, EventArgs e)
{
// Bug fix for MS SSRS Blank.gif 500 server error missing parameter IterationId
// https://connect.microsoft.com/VisualStudio/feedback/details/556989/
if (HttpContext.Current.Request.Url.PathAndQuery.StartsWith("/Reserved.ReportViewerWebControl.axd") &&
!String.IsNullOrEmpty(HttpContext.Current.Request.QueryString["ResourceStreamID"]) &&
HttpContext.Current.Request.QueryString["ResourceStreamID"].ToLower().Equals("blank.gif"))
{
Context.RewritePath(String.Concat(HttpContext.Current.Request.Url.PathAndQuery, "&IterationId=0"));
}
}
我有一个显示仪表盘麦粒肿报告的报告查看器控件。 它有几个图表来提供概览,但是在 IE11 中查看时,报告根本不会呈现,只是显示为空白。 底层存储过程也是 运行。
我做了一些测试
- 图表显示在 Firefox 中(当前)
- 图表显示在 Chrome(当前)
- 图表显示在 IE 兼容模式下。
- 如果我在网络查看器上使用 PDF 导出功能,它可以将原始字节流转换为带有图表的正确 PDF,这意味着报告 运行 正确。最初尝试显示报表时,基础存储过程仅 运行 一次。
我不确定这是否是 IE 与 webviewer 控件交互的方式的问题。
更新 - 借助 Fiddler 的魔力,在请求 blank.gif 时,看起来像是被吃掉了错误,但我相信这似乎是结果 gif 的占位符。 URL 中缺少 IterationId。 奇怪的是,查看 FireFox 和 Chrome 的 Fiddler 跟踪结果会出现关于 URL 中缺少的 IterationId 的相同错误,但图表仍然显示。我假设这仍然是问题所在。
请求header
GET /Reserved.ReportViewerWebControl.axd?ReportSession=....&Culture=1033
&CultureOverrides=True&UICulture=1033&UICultureOverrides=True
&ReportStack=1&ControlID=...
&OpType=ReportImage&ResourceStreamID=Blank.gif HTTP/1.1
文本回复
[HttpHandlerInputException: Missing URL parameter: IterationId]
Microsoft.Reporting.WebForms.HandlerOperation.GetAndEnsureParam(NameValueCollection urlQuery, String paramName) +104
Microsoft.Reporting.WebForms.ReportImageOperation.PerformOperation(NameValueCollection urlQuery, HttpResponse response) +102
Microsoft.Reporting.WebForms.HttpHandler.ProcessRequest(HttpContext context) +380
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +599
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +171
缺少的 IterationId 帮助我找到了类似的场景。 IterationId 在 IE11 中会像在 Chrome 和 Firefox 中一样失败是有道理的,因为 IE11 将自己介绍为 Mozilla 客户端。 "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
Devin Steinke 在 SQL Reporting Services - Viewer broken in Non-IE Browsers
上发表的这篇文章在我的 Global.asax 后面的代码中,我仅在对 ReportViewerWebControl blank.gif 的请求中附加了 IterationId 参数。 它现在可以在 IE11 中使用,并且仍然可以在 FireFox、Chrome 和旧版本的 IE 中使用。
您不会再看到来自 fiddler 的异常,结果文本显示 GIF 的检索,"GIF89a" 在我的例子中。
VB.NET:
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
Dim pathQuery = HttpContext.Current.Request.Url.PathAndQuery
Dim url = HttpContext.Current.Request.Url.ToString().ToLower()
If pathQuery.StartsWith("/Reserved.ReportViewerWebControl.axd") And Not url.Contains("iteration") Then
Dim resourceStreamId = HttpContext.Current.Request.QueryString("ResourceStreamId")
If IsNothing(resourceStreamId) Then Return
If resourceStreamId.ToString().Equals("blank.gif", StringComparison.InvariantCultureIgnoreCase) Then
Context.RewritePath(String.Concat(HttpContext.Current.Request.Url.PathAndQuery, "&IterationId=0"))
End If
End If
End Sub
C#:
void Application_BeginRequest(object sender, EventArgs e)
{
// Bug fix for MS SSRS Blank.gif 500 server error missing parameter IterationId
// https://connect.microsoft.com/VisualStudio/feedback/details/556989/
if (HttpContext.Current.Request.Url.PathAndQuery.StartsWith("/Reserved.ReportViewerWebControl.axd") &&
!String.IsNullOrEmpty(HttpContext.Current.Request.QueryString["ResourceStreamID"]) &&
HttpContext.Current.Request.QueryString["ResourceStreamID"].ToLower().Equals("blank.gif"))
{
Context.RewritePath(String.Concat(HttpContext.Current.Request.Url.PathAndQuery, "&IterationId=0"));
}
}