ASP.NET 会话已过期或找不到 -> 因为 Session.SessionID 更改(报告服务)

Posted

技术标签:

【中文标题】ASP.NET 会话已过期或找不到 -> 因为 Session.SessionID 更改(报告服务)【英文标题】:ASP.NET session has expired or could not be found -> Because the Session.SessionID changes (Reporting Services) 【发布时间】:2012-03-18 13:24:21 【问题描述】:

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 在每次请求时都发生变化?

【问题讨论】:

【参考方案1】:

reportviewer 显示在 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。

【讨论】:

解决了我的问题 :) 当我使用 IFrame 时,所有其他解决方案都不起作用【参考方案2】:

增加“MaxActiveReqForOneUser”的值

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

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

【讨论】:

【参考方案3】:

对我来说,Azure 托管的 Web 应用程序已开启 - ARR Affinity 解决了该问题。

ARR 关联开启

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

对我来说,结果证明应用程序池有多个工作进程。

【讨论】:

这是怎么回事?【参考方案7】:

我正在使用报表查看器 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 控件 这个解决方案对我有用,我希望对其他人有用。

问候

【讨论】:

为我工作。我不需要修改会话状态。 这对重新加载和交互报告的性能有何影响? 根据文档,使用这些设置,报告将工作 120 分钟,然后出现会话过期错误【参考方案8】:
<httpCookies httpOnlyCookies="false" requireSSL="false"/>

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

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 无关,而是与服务器集群有关。布赖恩在他的问题和随后的解决方案中提供的信息误导了我,因此进行了澄清。希望它可以帮助任何寻找类似问题的人。

谢谢, 维普尔

【讨论】:

【参考方案11】:

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

【讨论】:

我曾尝试将会话更改为状态服务器,但之后我收到其他错误:“无法序列化会话状态...”,所以,我想知道如何我可以使会话状态可序列化。 很可能你没有在你的状态中存储一些复杂的对象,并且这些对象是不可序列化的。确保所有对象都是可序列化的。看看这里是否有类似的问题:***.com/questions/5889240/… 看看这里有关 .NET 中序列化的详细信息:msdn.microsoft.com/en-us/library/ms973893.aspx 你又是对的!我没有意识到会话状态正在使用一个特殊的对象,所以,我只是使其类可序列化(使用您提供给我的第二个链接)并且报告现在工作正常...... 非常感谢! !

以上是关于ASP.NET 会话已过期或找不到 -> 因为 Session.SessionID 更改(报告服务)的主要内容,如果未能解决你的问题,请参考以下文章

如何解决session时间过期

如何在过期前延长asp.net中的会话超时

ASP.NET CORE 2.2 WEB APP中的会话过期问题

保持 ASP.NET 会话打开/活动

GetExpressCheckoutDetails 在 asp.net 中返回会话过期(10411 错误)(仅在某些计算机上)

如何使用httpcontext在asp.net中显示会话过期的消息