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

Ant*_*ony 119 asp.net session

在我的Web应用程序中,我执行类似这样的操作来读取会话变量:

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

我理解为什么重要的是要检查为什么HttpContext.Current.Session ["MyVariable"]为空(该变量可能尚未存储在会话中,或者会因各种原因重置了会话),但为什么我需要检查如果HttpContext.Current.Session是null?

我的理解是,会话是由ASP.NET自动创建的,因此HttpContext.Current.Session永远不应为null.这个假设是否正确?如果它可以为null,是否意味着我还应该在存储内容之前检查它:

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?
}
Run Code Online (Sandbox Code Playgroud)

dri*_*iis 153

是的,Session对象可能为null,但仅在某些情况下,您很少会遇到这种情况:

如果您只有页面中的代码,则不会遇到此问题.我的大多数ASP .NET代码都使用Session而不重复检查null.但是,如果你正在开发一个IHttpModule,或者在ASP .NET的粗略细节中,那么就要考虑一下.

编辑

回答评论:会话状态是否可用取决于是否已为请求运行AcquireRequestState事件.这是会话状态模块通过读取会话cookie并为您找到适当的会话变量集来完成它的工作.

AcquireRequestState在控制权交给您的Page之前运行.因此,如果您从页面调用其他功能(包括静态类),那么您应该没问题.

如果您有一些类在启动期间执行初始化逻辑,例如在Application_Start事件上或使用静态构造函数,则可能无法使用会话状态.这一切都归结为是否有当前请求并且已经运行了AcquireRequestState.

此外,如果客户端已禁用cookie,则Session对象仍然可用 - 但在下一个请求中,用户将返回一个新的空Session.这是因为如果客户端还没有Session bag,则会给它一个Session状态包.如果客户端没有传输会话cookie,我们无法将客户端识别为相同,因此他将一次又一次地交付新会话.

  • 我今天发现的一个快速更新.页面构造函数上没有会话!仅在Init事件或之后. (5认同)

Ed *_*hop 39

以下陈述并不完全准确:

"所以如果你从你的页面调用其他功能,包括静态类,你应该没问题"

我正在调用一个静态方法,它通过HttpContext.Current.Session引用会话,它是null.但是,我通过使用jQuery的ajax通过webservice方法调用该方法.

正如我在此处发现的那样,您可以使用方法的简单属性修复问题,或使用Web服务会话对象:

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

[WebMethod(EnableSession = true)]

通过指定EnableSession值,您现在可以使用托管会话.如果未指定此值,则将获得一个空的Session对象,并且在尝试访问会话对象时很可能会遇到空引用异常.

感谢Matthew Cozier的解决方案.

我以为我会加两分钱.

埃德


mat*_*gen 18

如果您的Session实例为null并且您在'ashx'文件中,则只需实现'IRequiresSessionState'接口.

此接口没有任何成员,因此您只需在类声明(C#)后添加接口名称:

public class MyAshxClass : IHttpHandler, IRequiresSessionState
Run Code Online (Sandbox Code Playgroud)

  • 为我工作,使用Uploadify上传脚本,谢谢. (2认同)

Eri*_*ric 6

就我而言,ASP.NET State Service被阻止了。第一次更改为Startup type并手动启动服务解决了该问题。Automatic