在我的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永远不应该为空。这个假设是正确的吗?如果它可以是空的,这是否意味着我在存储东西之前也应该检查它:
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?
}
发布于 2009-09-05 00:51:43
是的,会话对象可能为空,但仅在某些情况下,您很少会遇到这种情况:
如果你只有页面中的代码,你就不会遇到这种情况。我的大多数ASP .NET代码都使用会话,而不重复检查null。然而,如果你正在开发一个IHttpModule或者其他一些关于ASP .NET的细节,这是一个需要考虑的问题。
编辑
在对评论的回答中:会话状态是否可用取决于是否为请求运行了AcquireRequestState事件。这就是会话状态模块通过读取会话cookie并为您找到合适的会话变量集来执行其工作的地方。
AcquireRequestState在控制交给你的页面之前运行。因此,如果您要从页面调用其他功能,包括静态类,则应该没问题。
如果有一些类在启动期间执行初始化逻辑,例如在Application_Start事件上或通过使用静态构造函数,则会话状态可能不可用。这一切都归结为是否存在当前请求以及AcquireRequestState是否已运行。
此外,如果客户端禁用了cookie,会话对象仍将可用-但在下一次请求时,用户将返回一个新的空会话。这是因为如果客户端还没有会话状态包,就会给它一个会话状态包。如果客户端不传输会话cookie,我们将无法识别相同的客户端,因此将一次又一次地向他传递一个新会话。
发布于 2011-02-07 08:40:34
以下陈述并不完全准确:
“因此,如果您要从页面调用其他功能,包括静态类,则应该没问题。”
我正在调用一个通过HttpContext.Current.Session引用会话的静态方法,它是空的。但是,我使用jQuery通过ajax通过webservice方法调用该方法。
正如我发现的here,你可以在方法上使用一个简单的属性来解决这个问题,或者使用web服务会话对象:
虽然有一个技巧,为了访问web方法中的会话状态,您必须像这样启用会话状态管理:
WebMethod(EnableSession =真)
通过指定EnableSession值,您现在就可以使用托管会话了。如果你不指定这个值,你将得到一个空的会话对象,并且很可能在试图访问会话对象时遇到空引用异常。
感谢Matthew Cosier的解决方案。
我想补充一下我的两点意见。
边缘
发布于 2011-01-05 10:31:27
如果您的会话实例为空,并且位于'ashx‘文件中,则只需实现'IRequiresSessionState’接口。
此接口没有任何成员,因此您只需在类声明(C#)后添加接口名称:
public class MyAshxClass : IHttpHandler, IRequiresSessionState
https://stackoverflow.com/questions/1382791
复制相似问题