【问题标题】:SSRS exceptions Operation is not valid due to the current state of the object. and AspNetSessionExpiredExceptionSSRS 异常 由于对象的当前状态,操作无效。和 AspNetSessionExpiredException
【发布时间】:2013-03-12 15:28:25
【问题描述】:

在我的 asp.net 应用程序中,我有一个报告视图,当运行具有大量参数的报告时连接到 ssrs 端点(选择参数列表中的所有选项)我收到以下异常被抛出

Operation is not valid due to the current state of the object.

我在这里看到了许多博客以及帖子,其中提到了 MS 应用的安全补丁作为造成此问题的原因,该补丁将您可以在集合中拥有的项目数量限制为 1000 个。

我还看到了在 web.config 文件中为位于 C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer 的 wcf 托管服务添加 appSettings 标记并添加以下条目的建议

<appSettings>
    <add key="aspnet:MaxHttpCollectionKeys" value="20000" />
  </appSettings>

我尝试了这些建议,但没有成功。运行 sql2008r2 的服务器没有提到任何安全更新,并且将 appSettings 值添加到 web.config(用于 ssrs 管理站点或端点的配置)对异常没有任何影响。如果我有超过 2 万件物品,我什至会增加价值 (100000)。

我的第二个想法是 wsHttp 请求上的数据包大小可能太大,我也需要增加它。

更新 在挖掘了更多之后,我发现我在正确的轨道上。以上是根据 MS 条目KB2661403 的部分解决方案,MaxCollectionKey 只是条目的一部分。第二部分是参数的序列化,需要将第二个条目添加到 appSettings 部分

<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />

当我开始思考这个问题时,我在需要输入的地方也是不正确的。它不需要在 SSRS 端点 web.config 上输入,而是在托管报表查看器控件的站点上输入。将这两个条目添加到 web.config 已导致对象成功传递。现在 SSRS 系统正在返回一个 ASP.NETSessionTimeOut 异常,所以我需要尝试延长这个超时时间,看看我是否可以在大型查询中取回数据。

大家有什么意见或建议吗?

-干杯

【问题讨论】:

  • 我认为你应该退后一步重新设计这个报告,这样它就不需要传递这么多的参数值,并且也在超时时间内运行。这两个问题通常是相关的 - 发送数千个参数值会创建一个困难的查询计划。
  • @MikeHoney 是的,我同意,但不管我的建议如何,产品管理部门都认为它不是这样(大声笑)
  • 一定要喜欢那些告诉 IT 如何完成工作的经理。让您想知道他们为什么不听专家的话,为什么要聘请专家。祝你好运!

标签: asp.net reporting-services


【解决方案1】:

您不能总是重新设计报告——当客户想要时,客户想要。

也就是说,对于越来越多的包含用于级联参数的大型数据集的报告,我们经常遇到此错误。我们有一些包含多个参数的报告,下拉列表中有超过 1500 个值。上述解决方案对某些人有效,但对其他人无效。就在那时,一位同事 (Pranay Papishetty) 提出了一个很好的解决方法(我将所有字段名称保留原样,而不是换成通用描述。您应该仍然能够理解这一点):

修复 POS_08 的订阅问题:

报告 POS_08 有一个带有标签 Organization Unit: 的参数,它的下拉值接近 1500。该报告还有几个其他参数,每个参数的下拉值计数相当可观,这是在设置订阅时产生的问题那个报告。对于大量的参数下拉值,即使对报表服务器进行了一些架构更改,问题也没有得到解决。

我在数据集中提出了一种参数屏蔽。通常,为了将组织单位传递给主数据集查询,我们在 where 子句的主查询中使用以下过滤器

dbo.vw_orgunit.orgunit in @orgunit

(@OrgUnit 是将组织单位传递给查询的参数。)

我没有使用上面的过滤器作为组织单位,而是使用了一个修改后的过滤器,如下所示:

((dbo.vw_orgunit.Orgunit IN ((SELECT item
FROM   [DW_Master].[dbo].fn_Split (@orgunit_d, ','))))
OR (@orgunit_d) IN ('All Org Units'))

参数Organization Unit对应的数据集也修改如下,在下拉值中添加值“All Org Units”。

    SELECT DISTINCT 
       [OrgUnit] AS [OrgUnit_Code], 
       [OrgUnitDescription] AS [OrgUnit_Desc], 
       ([OrgUnit] + ' - ' + [OrgUnitDescription]) AS [OrgUnit_Label]
FROM dbo.vw_DimOrgUnit
WHERE (
        [OrgLevelAgency] = '73' 
        AND [OrgLevelFiscalYear] IN ( @FiscalYear )
        AND ([OrgLevel_1] + ' - ' + [OrgLevel_1_Description]) IN ( @OrgLevel_1_Label )
        AND ([OrgLevel_2] + ' - ' + [OrgLevel_2_Description]) IN ( @OrgLevel_2_Label )
        AND ([OrgLevel_3] + ' - ' + [OrgLevel_3_Description]) IN ( @OrgLevel_3_Label )
      ) OR [OrgUnitSKey] = '-1' OR ( [OrgUnit] = '5117' AND [OrgUnitFiscalYear] = '2013' /* A Special Case*/ )

UNION
SELECT '' , '', '(Blank)'
UNION
SELECT 'none' , 'none', 'None'
UNION 
SELECT '-100','All Org Units','All Org Units'
ORDER BY [OrgUnit]
;

这样,当用户想要选择所有组织单位时,他们可以只选择“所有组织单位”,而不是选择整个下拉值并将其传递给查询。 这减少了报告的执行时间并提高了查询的性能。实施所有更改后,订阅也设置成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-25
    • 2010-10-18
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多