asp.net session过期事件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net session过期事件相关的知识,希望对你有一定的参考价值。

用户退出时,需要改变在线状态。当session到期时,用户的登陆状也相应的设置成离线状态。是不是有相应的session过期的事件,在过期的时候能执行这些操作。或者是有其他更好的实现方法。请高手相助

除非用户是明确点了退出按钮,你可以知道用户的Session可以过期

如果Session是使用默认的Inproc方式,可以使用Session_End事件,但如果如果会话模式设置为 StateServer 或 SQLServer,则不会引发该事件。在实际应用中,我从未见过那个系统用此事件。

一般情况下,都是客户端用ajax定时向服务器发消息(说明自己在线),比如每1分钟向服务器发出一个消息,服务器就知道此客户端依然在线,如果连续两分钟没收到消息,则认为用户已离线
参考技术A 上边俩哥们不要乱说。你自己建立一个Glabal.asax在主目录中,复制以下代码,注意看最下边那个方法
<%@ Application Language="C#" %>

<script runat="server">

void Application_Start(object sender, EventArgs e)

// 在应用程序启动时运行的代码



void Application_End(object sender, EventArgs e)

// 在应用程序关闭时运行的代码



void Application_Error(object sender, EventArgs e)

// 在出现未处理的错误时运行的代码



void Session_Start(object sender, EventArgs e)

// 在新会话启动时运行的代码
//string ipAddress = Request.ServerVariables["REMOTE_ADDR"];

//string ipSrc;

//if (Request.UrlReferrer == null)
//
// ipSrc = "";
//
//else
//
// ipSrc = Request.UrlReferrer.ToString();
//

//DateTime ipDatetime = DateTime.Now;

//IPControl cont = new IPControl();

//cont.AddIP(ipAddress, ipSrc, ipDatetime);

//string pageurl = Request.Url.ToString();

//if(pageurl.EndsWith("index.aspx"))
//
// Application.Lock();

// Application["StatCount"] = int.Parse(Application["StatCount"].ToString()) + 1;

// Application.UnLock();
//

Session.Timeout=30;

Application.Lock();

Application["countSession"] = Convert.ToInt32(Application["countSession"]) + 1;

//访问总人数+1

Application.UnLock();



void Session_End(object sender, EventArgs e)

// 在会话结束时运行的代码。
// 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
// InProc 时,才会引发 Session_End 事件。如果会话模式设置为 StateServer
// 或 SQLServer,则不会引发该事件。



</script>
参考技术B 在工程的Global.asax里的Application_Error加上捕获是一种方法。
不过我没试过,我是在每个页面的pageload方法里这样写的。
if (dataCachePool == null) //此为变量null,表示登录已过期。

ClientScript.RegisterStartupScript(this.GetType(), "Reload", "<script language=\"javascript\">parent.document.location.href= '../DefaultWebForm.aspx';</script>");
if (Session["SystemLogoutAlert"] == null)
Session.Add("SystemLogoutAlert", "登录已过期。");
return false;
然后在DefaultWebForm判断SystemLogoutAlert的内容。决定页面显示登录信息还是登录后信息。
参考技术C 可以在WEB.CONFIG里设置session的有效期。
<sessionState timeout=""/>填写你想要的时间。
session过期或者丢失你在页面上加个判断
if (Session["xxx"] == null)

Response.Write("<script>alert('超时,请重新登录');window.location.href='login.aspx';</script>");

提示重新登陆才行。
参考技术D session过期事件是无法利用的。
你可以这样做,记录客户端最后一次点击的时间(每点击一次,就把时间更新到数据库中。),因为session的有效期默认值是20分钟,如果客户端最后一次点击的时间与服务器当前时间的差大于20分钟,证明客户端已经离线了。

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

【中文标题】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过期事件的主要内容,如果未能解决你的问题,请参考以下文章

asp.net 如何设置单个session 过期时间?

asp.net 如果用户一直与session交互 那session就会一直不会过期吗

如何解决session时间过期

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

Asp.Net里关于Session过期跳转页面的一些小技巧

asp.net中,当我浏览一个.aspx文件时显示Session已经过期,请重新登陆啥意思