如果当前的ASP.NET会话为空,我该怎么办?

在我的web应用程序中,我这样做来读取会话variables:

if (HttpContext.Current.Session != null && HttpContext.Current.Session["MyVariable"] != null) { string myVariable= (string)HttpContext.Current.Session["MyVariable"]; } 

我明白为什么要检查为什么HttpContext.Current.Session [“MyVariable”]为空(该variables可能尚未存储在会话中,或者由于各种原因会话已被重置)为什么非常重要,但是为什么需要检查如果HttpContext.Current.Session为空?

我的理解是会话是由ASP.NET自动创build的,因此HttpContext.Current.Session不应该为空。 这个假设是否正确? 如果它可以为空,是否意味着我应该检查它之前存储的东西:

 if (HttpContext.Current.Session != null) { HttpContext.Current.Session["MyVariable"]="Test"; } else { // What should be done in this case (if session is null)? // Is it possible to force the session to be created if it doesn't exist? } 

是的,Session对象可能是空的,但只有在某些情况下,你很less遇到:

  • 如果您禁用了SessionState http模块 ,则完全禁用会话
  • 如果您的代码在HttpApplication.AcquireRequestState事件之前运行。
  • 您的代码在IHttpHandler中运行,不会指定IRequiresSessionState或IReadOnlySessionState接口。

如果你只有页面中的代码,你不会碰到这个。 我的大部分ASP .NET代码都使用Session而不重复检查null。 但是,如果你正在开发一个IHttpModule,或者在ASP.net的细节上下了功夫,那么这是一件值得思考的事情。

编辑

回答评论:会话状态是否可用取决于是否为请求运行AcquireRequestState事件。 这是会话状态模块通过读取会话cookie并为您find适当的会话variables集合的工作。

AcquireRequestState在控制权交给你的页面之前运行。 所以如果你从页面调用其他的function,包括静态类,你应该没问题。

如果您有一些类在启动期间执行初始化逻辑,例如在Application_Start事件或通过使用静态构造函数,则会话状态可能不可用。 这一切归结为是否有当前的请求和AcquireRequestState已经运行。

另外,如果客户端已经禁用了Cookie,Session对象仍然可用 – 但是在下一个请求中,用户将返回一个新的空Session。 这是因为如果客户没有一个会话状态包,那么它会被给予一个会话状态包。 如果客户端不传输会话cookie,我们没有办法识别客户端,所以他会一次又一次地递交新的会话。

以下声明不完全准确:

“所以,如果你从页面调用其他function,包括静态类,你应该没问题”

我正在调用通过HttpContext.Current.Session引用会话的静态方法,它是空的。 不过,我通过使用jQuery的ajax通过webservice方法调用方法。

正如我在这里发现的,你可以用方法的一个简单属性来解决问题,或者使用Web服务会话对象:

有一个技巧,为了访问Web方法中的会话状态,您必须启用会话状态pipe理,如下所示:

[WebMethod(EnableSession = true)]

通过指定EnableSession值,您现在将拥有一个pipe理会话。 如果你不指定这个值,你将会得到一个空的Session对象,并且当试图访问会话对象的时候很可能会碰到空引用exception。

感谢Matthew Cozier提供的解决scheme。

只是想我会增加我的两分钱。

埃德

如果您的Session实例为null,并且您在“ashx”文件中,只需实现“IRequiresSessionState”接口。

这个接口没有任何成员,所以你只需要在类声明(C#)之后添加接口名称:

 public class MyAshxClass : IHttpHandler, IRequiresSessionState 

ASP.NET技术文章

概要:在ASP.NET中,每个Web页都从System.Web.UI.Page类派生。 Page类聚合会话数据的HttpSession对象的一个​​实例。 Page类公开了不同的事件和方法来定制。 特别是,OnInit方法用于设置Page对象的初始化状态。 如果请求没有Session cookie,则会向请求者发送一个新的Session cookie。

编辑:

会议:初学者的概念

摘要:会话是在用户向Web服务器中的任何页面发送服务器的第一个请求时创build的,应用程序创build会话并将会话ID发送回给具有响应的用户,并作为小cookie存储在客户端计算机中。 所以理想情况下,“禁用cookies的机器,会话信息将不会被存储”。