如果当前 ASP.NET 会话为 null,我应该做什么?

在我的 web 应用程序中,我做了一些类似的事情来读取会话变量:

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

我理解为什么检查 HttpContext 很重要。现在。Session [“ MyVariable”]为 null (变量可能还没有存储在 Session 中,或者 Session 由于各种原因已经重置) ,但是为什么我需要检查 HttpContext.Current.Session是否为 null?

我的理解是,会话是由 ASP.NET 自动创建的,因此 HttpContext。现在。会话不应该为空。这个假设正确吗?如果它可以为空,这是否意味着在存储某些内容之前,我也应该检查它:

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?
}
173520 次浏览

ASP.NET 技术文章

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

编辑:

课程: 初学者的概念

当用户 向服务器发送第一个请求 对于网络应用程序中的任何页面, 应用程序创建会话 并将会话 ID 发送回 用户与响应,并存储 在客户端机器中作为一个小 饼干,所以最理想的是 已经禁用了 cookie,会话 信息将不会被储存”。

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

如果只有页面中的代码,就不会遇到这种情况。我的大部分 ASP。NET 代码使用 Session 而不重复检查 null。但是,如果您正在开发一个 IHttpModule,或者在 ASP 的细节方面有所欠缺,那么需要考虑一下这个问题。NET.

剪辑

回答注释: 会话状态是否可用取决于 AcquireRequestState 事件是否已为请求运行。这就是会话状态模块通过读取会话 cookie 并为您查找适当的会话变量集来完成工作的地方。

AcquireRequestState 在将控件移交到页面之前运行。因此,如果您正在从页面调用其他功能(包括静态类) ,那么应该没有问题。

如果有一些类在启动期间执行初始化逻辑,例如在 Application _ Start 事件上或通过使用静态构造函数,则 Session 状态可能不可用。这一切都归结为是否存在当前请求并且已经运行了 AcquireRequestState。

此外,如果客户端禁用了 cookie,Session 对象仍然可用——但是在下一个请求中,用户将返回一个新的空 Session。这是因为如果客户端还没有会话状态包,那么它就会得到一个会话状态包。如果客户端没有传输会话 cookie,我们没有办法将客户端标识为相同的,因此将一次又一次地向他传递新的会话。

如果 Session 实例为 null,并且位于“ ashx”文件中,那么只需实现“ IRequresSessionState”接口。

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

public class MyAshxClass : IHttpHandler, IRequiresSessionState

以下说法并不完全准确:

因此,如果您正在从页面调用其他功能,包括静态类,那么应该没问题

我正在调用一个通过 HttpContext 引用会话的静态方法。现在。会话,它为空。但是,我使用 jQuery 通过 ajax 通过一个 webservice 方法调用该方法。

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

但是有一个技巧,为了访问 web 方法中的会话状态,您必须像下面这样启用会话状态管理:

[ WebMethod (EnableSession = true)]

通过指定 EnableSession 值,您现在可以使用托管会话。如果不指定这个值,您将得到一个 null Session 对象,并且在尝试访问会话对象时很可能会遇到 null 引用异常。

感谢 Matthew Cosier 提供的解决方案。

我只是觉得我应该多说两句。

艾德

在我的情况下 ASP.NET State Service被停止。将 Startup type更改为 Automatic并首次手动启动服务解决了这个问题。