在我的ASP.NET应用程序中,我有一个记录文件所有异常的过程(使用Application_Error()
和global.asax
)。在该过程中,我记录了一些事情,如当前日期时间,用户名等。
但是,如果有人(已经记录)尝试访问不存在的页面(例如:http://www.mywebsite.com/foo.aspx),则无法从过程访问当前用户名信息,因为{{1 }} 一片空白。起初,我认为会话已经丢失。这不是真的,因为如果我按回来我仍然可以使用该网站(链接仍然可以工作,而不会被重定向到登录页面)。
如果找不到资源,会话为空的原因是什么?是因为会话对象只有在知道要传递哪个页面后才由asp初始化?或者在我的网站上可能没有正确配置某些东西?
答案 0 :(得分:3)
看一下ASP.NET事件生命周期:
http://msdn.microsoft.com/en-us/library/bb470252.aspx
特别是HttpApplication
如何处理您的请求。请注意,在BeginRequest
(第3名)和AcquireRequestState
(第12名)之前,至少有一些重要事件。
现在,您的会话仅在 <{strong> AcquireRequestState
后可用。如果您之前的某个事件中有任何错误,您将在Session
上获得空引用。
“未找到资源”只是一个示例,但一般情况下,您必须准备Session
在处理管道的早期事件中不可用。
答案 1 :(得分:1)
如果您的应用程序抛出类似HTTP 404(找不到文件)的错误,则Session始终为null。原因是HttpContext对象是在页面请求期间由ASP.NET创建的。由于没有找到页面,因此无法创建HttpContext对象;因此,当发生404错误时,不存在任何会话。
查看以下asp.net线程以了解类似的问题和解决方案
答案 2 :(得分:0)
Session
属于HttpContext
,如果没有网页,则不会创建HttpContext
。
如果所有日志条目的会话ID都是必填项,您可能需要创建自定义404页面并在那里登录。