在Web应用程序中,当“无法找到资源”异常发生时,当前会话为空

时间:2012-03-29 13:25:53

标签: c# asp.net web

在我的ASP.NET应用程序中,我有一个记录文件所有异常的过程(使用Application_Error()global.asax)。在该过程中,我记录了一些事情,如当前日期时间,用户名等。

但是,如果有人(已经记录)尝试访问不存在的页面(例如:http://www.mywebsite.com/foo.aspx),则无法从过程访问当前用户名信息,因为{{1 }} 一片空白。起初,我认为会话已经丢失。这不是真的,因为如果我按回来我仍然可以使用该网站(链接仍然可以工作,而不会被重定向到登录页面)。

如果找不到资源,会话为空的原因是什么?是因为会话对象只有在知道要传递哪个页面后才由asp初始化?或者在我的网站上可能没有正确配置某些东西?

3 个答案:

答案 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线程以了解类似的问题和解决方案

http://forums.asp.net/t/1648782.aspx/1

答案 2 :(得分:0)

Session属于HttpContext,如果没有网页,则不会创建HttpContext

如果所有日志条目的会话ID都是必填项,您可能需要创建自定义404页面并在那里登录。