在我的Web应用程序中,我执行类似这样的操作来读取会话变量:
if (HttpContext.Current.Session != null && HttpContext.Current.Session["MyVariable"] != null)
{
string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}
我理解为什么重要的是检查为什么HttpContext.Current.Session [“MyVariable”]为空(该变量可能尚未存储在会话中,或者会因各种原因重置了会话),但为什么我需要检查HttpContext.Current.Session
是否为空?
我的理解是会话是由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?
}
答案 0 :(得分:150)
是的,Session对象可能为null,但仅限于某些情况,您很少会遇到这种情况:
如果您只有页面中的代码,则不会遇到此问题。我的大多数ASP .NET代码都使用Session而不重复检查null。但是,如果你正在开发一个IHttpModule,或者在ASP .NET的粗略细节中,那么可以考虑一下。
回答评论:会话状态是否可用取决于是否为请求运行了AcquireRequestState事件。这是会话状态模块通过读取会话cookie并为您找到适当的会话变量集来完成工作的地方。
AcquireRequestState在控制权交给您的Page之前运行。因此,如果您从页面调用其他功能(包括静态类),那么您应该没问题。
如果您有一些类在启动期间执行初始化逻辑,例如在Application_Start事件上或使用静态构造函数,则可能无法使用会话状态。这一切都归结为是否有当前请求并且已经运行了AcquireRequestState。
此外,如果客户端已禁用cookie,则Session对象仍然可用 - 但在下一个请求中,用户将返回一个新的空Session。这是因为如果客户端还没有Session bag,则会给它一个Session状态包。如果客户端没有传输会话cookie,我们无法将客户端识别为相同,因此他将一次又一次地提交新会话。
答案 1 :(得分:39)
以下陈述并不完全准确:
“所以如果你从你的页面调用其他功能,包括静态类,你应该没问题”
我正在调用一个通过HttpContext.Current.Session引用会话的静态方法,它是null。但是,我通过使用jQuery的ajax通过webservice方法调用该方法。
当我发现here时,您可以使用方法的简单属性解决问题,或者使用Web服务会话对象:
但是有一个技巧,为了在Web方法中访问会话状态,您必须启用会话状态管理,如下所示:
[WebMethod(EnableSession = true)]
通过指定EnableSession值,您现在可以使用托管会话。如果未指定此值,则将获得一个空的Session对象,并且在尝试访问会话对象时很可能会遇到空引用异常。
感谢Matthew Cozier的解决方案。
以为我会加两分钱。
版
答案 2 :(得分:18)
如果您的Session实例为空并且您在'ashx'文件中,只需实现'IRequiresSessionState'接口。
此接口没有任何成员,因此您只需在类声明(C#)后添加接口名称:
public class MyAshxClass : IHttpHandler, IRequiresSessionState
答案 3 :(得分:2)
总结:在ASP.NET中,每个网页 派生自System.Web.UI.Page 类。 Page类聚合了一个 HttpSession对象的实例 会话数据。 Page类暴露 不同的事件和方法 定制。特别是 OnInit方法用于设置 初始化Page对象的状态。 如果请求没有 会话cookie,一个新的Session cookie 将发给请求者。
编辑:
Session: A Concept for Beginners
摘要:会话在用户创建时创建 向服务器发送第一个请求 对于Web应用程序中的任何页面, 应用程序创建会话 并将会话ID发回给 用户有响应并存储 在客户端机器上作为一个小的 曲奇饼。理想情况下,“机器 已禁用cookie,会话 信息不会被存储“。
答案 4 :(得分:1)
在我的情况下,ASP.NET State Service
已停止。将Startup type
更改为Automatic
并首次手动启动服务即可解决此问题。