在web应用程序中,当前会话为空,当“;无法找到资源“;出现异常
本文关键字:异常 资源 应用程序 web 会话 | 更新日期: 2023-09-27 18:29:19
在我的ASP.NET应用程序中,我有一个过程将所有异常记录到一个文件中(使用Application_Error()
和global.asax
)。在这个过程中,我记录了一些事情,比如当前日期时间、用户名等等。
然而,如果有人(已经登录)试图访问不存在的页面(例如:http://www.mywebsite.com/foo.aspx)由于System.Web.HttpContext.Current.Session
为null,因此无法从过程中访问当前用户名信息。一开始,我以为会议已经结束了。这不是真的,因为如果我按下返回键,我仍然可以使用该网站(链接仍然有效,而无需重定向到登录页面)。
如果找不到资源,会话为空的原因是什么是因为会话对象只有在知道要传递哪个页面后才由asp初始化吗?或者可能是我的网站配置不正确?
查看ASP.NET事件生命周期:
http://msdn.microsoft.com/en-us/library/bb470252.aspx
特别是HttpApplication
如何处理您的请求。注意,在BeginRequest
(编号3)和AcquireRequestState
(编号12)之前,至少有一些重要事件。
现在,您的会话仅在AcquireRequestState
之后可用。如果您在之前的某个事件中有任何错误,您将在Session
上获得null引用。
"找不到资源"只是一个例子,但通常情况下,您必须准备好Session
在处理管道的早期事件中不可用。
如果您的应用程序抛出类似HTTP 404(找不到文件)的错误,则会话始终为null。原因是HttpContext对象是由ASP.NET在页面请求期间创建的。由于找不到任何页面,因此无法创建HttpContext对象;因此,当404错误发生时,不可能存在会话。
查看以下asp.net线程以了解类似的问题和解决方案
http://forums.asp.net/t/1648782.aspx/1
Session
属于HttpContext
,如果没有页面,则不会创建HttpContext
。
如果所有日志条目都必须具有会话id,那么您可能需要创建一个自定义404页面并在那里进行日志记录。