ASP.NET会话已过期或无法找到 - >因为Session.SessionID更改(Reporting Services)

时间:2012-02-29 02:15:41

标签: asp.net reporting-services session-state sessionid

1.我正在使用报告服务,有时当我尝试加载报告时出现此错误ASP.NET session has expired or could not be found

2.-我意识到,即使用户相同,Session.SessionID属性也会发生此错误。如果它没有改变,则加载报告。我的意思是,如果我多次刷新报告,只要Session.SessionID与最后一个相同,就会加载报告。

3.-微软文档说:

  

使用基于cookie的会话状态时,ASP.NET不会分配   存储会话数据,直到使用Session对象。作为一个   结果,为每个页面请求生成一个新的会话ID,直到   访问会话对象。如果您的应用程序需要静态   整个会话的会话ID,您可以实现   应用程序的Global.asax文件和存储中的Session_Start方法   Session对象中的数据用于修复会话ID,或者您可以使用代码   在应用程序的另一部分中显式存储数据   会话对象。

     

如果您的应用程序使用无cookie会话状态,那么   会话ID在第一个页面视图上生成并维护   整个会议。

关键是我不能使用无Cookie会话状态,因为我需要cookie。

我该怎么做才能避免这个错误?或者我该怎么做才能避免每次请求都改变Session.SessionID?

10 个答案:

答案 0 :(得分:5)

您可能正在存储会话InProcess。尝试将其更改为会话状态服务器。您可以找到更多详细信息here

答案 1 :(得分:3)

我正在使用报告查看器11.0.0;在system.web部分的web配置中,进行下一个配置:

<sessionState timeout ="120" mode="InProc" cookieless="false" />

当您在reportviewer对象中生成报告(C#代码如下)时,将KeepSessionAlive属性更改为false,并将AsynkRendering属性更改为false,这就是

        this.rvReporte.KeepSessionAlive = false;
        this.rvReporte.AsyncRendering = false;

(rvReporte)是一个位于我的asp.net表单上的ReportViewer控件 这个解决方案对我有用,我希望能为其他人工作。

问候

答案 2 :(得分:2)

<httpCookies httpOnlyCookies="false" requireSSL="false"/>

解决了这个问题。 谢谢 : http://www.c-sharpcorner.com/Blogs/8786/reportviewer-Asp-Net-session-has-expired.aspx

答案 3 :(得分:2)

我通过在reportviewer服务器控件上将AsyncRendering设置为false来解决此问题

答案 4 :(得分:1)

Alexsandar给出的答案只是这个问题的解决方案之一。

此链接清楚地说明了此问题的根本原因和可能的解决方案: http://blogs.msdn.com/b/brianhartman/archive/2009/02/15/did-your-session-really-expire.aspx

对于Brian,他描述问题的方式,如果他只有一个IIS服务器,在他的代码中使用会话对象就可以解决问题,因为在这种情况下,在请求中传递的SessionID从浏览器到服务器将被映射到服务器上的相应sessionID,因此会话到期消息将不会到来。

设置模式仅适用于服务器群集,其中Brian有多个IIS服务器处理相同的请求。在这种情况下,进程外模式将有助于从会话存储中检索会话对象,而不管服务器命中。

基于这种观察,我得出结论,Brian的问题与cookie无关,而是与服务器集群有关。 Brian在他的问题和随后的解决方案中提供的信息误导了我,因此澄清了这一点。希望它可以帮助任何寻找类似问题的人。

谢谢, VIPUL

答案 5 :(得分:1)

从外部Intranet访问网站时,我在报表查看器页面上遇到了同样的问题。 hardvin的建议为我节省了一天的时间 this.rvReporte.KeepSessionAlive = false; this.rvReporte.AsyncRendering = false;

我更改了控件本身的属性。我在用户控件上使用报表查看器,它引发了一个自定义事件,用于在主机页面以编程方式提供参数,而不是提示用户。

答案 6 :(得分:0)

尝试从您调用的ASPX页面顶部删除 SessionState =“somevalue”标记。我正在使用自定义SessionState并拒绝使用InProc,因为我在Azure上有多个实例。如果您愿意,甚至可以使用AsyncRendering = True。如果这对您有用,请告诉我。

答案 7 :(得分:0)

对我来说,Azure托管的Web应用处于打开状态-ARR Affinity解决了该问题。

ARR关联性开启

enter image description here

答案 8 :(得分:0)

增加值“ MaxActiveReqForOneUser”

“ C:\ Program Files \ Microsoft SQL Server \ MSRS13.MSSQLSERVER \ Reporting Services \ ReportServer \ rsreportserver.config”

**<Add Key="MaxActiveReqForOneUser" Value="200"/>**

答案 9 :(得分:0)

在 iframe 中显示报表查看器给我们带来了这个错误。如果显示在 iframe 之外,效果很好。 reportviewer 对象有这样的配置,AsyncRendering = false 和 KeepSessionAlive = true。

具有报表查看器并在浏览器中设置会话 cookie 的 web 应用程序是使用 .net 框架 4.6.1 编译的。我们升级到 4.8 并将其放入 web.config

<sessionState cookieSameSite="None" />
    <httpCookies requireSSL="true"/>

所以解决方案来自https://docs.microsoft.com/en-us/aspnet/samesite/system-web-samesite#:~:text=The%20updated%20standard%20is%20not%20backward%20compatible%20with,SameSite%3DStrict.%20See%20Supporting%20older%20browsers%20in%20this%20document