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交互 那session就会一直不会过期吗