SSRS报表查看器 - 报表图表在IE11中无法显示

4
我有一个报表查看器控件,显示仪表板式报表。它有几个图表来提供概览,但是在IE11中查看时,报表根本不会呈现,只会显示为空白。底层存储过程也在运行。
我进行了一些测试:
- 图表在Firefox(当前版本)中显示。 - 图表在Chrome(当前版本)中显示。 - 图表在IE兼容模式下显示。 - 如果我在我的Web查看器上使用PDF导出功能,它能够将原始字节流转换为带有图表的正确PDF,这意味着报表已经正确运行。当尝试显示报表时,底层存储过程仅运行一次。
我不确定这是否是IE与Web查看器控件交互的问题。
更新 - 通过Fiddler的神奇,似乎请求空白.gif时存在一个错误被吞噬并未显示,我认为这是结果gif的占位符。URL中缺少IterationId。奇怪的是,对于FireFox和Chrome的Fiddler跟踪结果进行审查,同样关于URL中缺少IterationId的错误出现,但图表仍然显示。虽然我认为这仍然是问题所在。
请求头:
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

IE11和SSRS存在问题。可能更新最新SP会有所帮助。请参阅此处 - SouravA
我也会尝试这个,感谢提供链接。 - crackhaus
已确认此问题发生在 SQL 2008 R2 SP3(该版本的最终更新)下。 - Alex Angas
1个回答

5
缺少IterationId帮助我找到了类似的情况。由于IE11将自己介绍为Mozilla客户端,因此IterationId在Chrome和Firefox中失败也是有道理的。 "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"));
    }
}

非常感谢你!对我来说,500错误在非IE浏览器中也发生了,但它们仍然显示了图表。无论如何,我使用控制适配器(在SharePoint中无法调整global.asax)实现了你的IterationId修复方法。问题解决了! - Alex Angas
我希望我能多次点赞!在我的情况下,报告根本不会返回 - 它只会在IE11中不断旋转“加载...”图形。我尝试了许多其他想法来解决这个问题,但这是唯一有效的方法。我像你描述的那样使用Fiddler验证了这个问题。真是一个令人困惑的问题! - laughsloudly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接