首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果当前ASP.NET会话为空,该怎么办?

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

Stack Overflow用户
提问于 2009-09-05 00:34:00
回答 5查看 166.6K关注 0票数 134

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

代码语言:javascript
运行
AI代码解释
复制
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永远不应该为空。这个假设是正确的吗?如果它可以是空的,这是否意味着我在存储东西之前也应该检查它:

代码语言:javascript
运行
AI代码解释
复制
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?
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-09-05 00:51:43

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

如果你只有页面中的代码,你就不会遇到这种情况。我的大多数ASP .NET代码都使用会话,而不重复检查null。然而,如果你正在开发一个IHttpModule或者其他一些关于ASP .NET的细节,这是一个需要考虑的问题。

编辑

在对评论的回答中:会话状态是否可用取决于是否为请求运行了AcquireRequestState事件。这就是会话状态模块通过读取会话cookie并为您找到合适的会话变量集来执行其工作的地方。

AcquireRequestState在控制交给你的页面之前运行。因此,如果您要从页面调用其他功能,包括静态类,则应该没问题。

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

此外,如果客户端禁用了cookie,会话对象仍将可用-但在下一次请求时,用户将返回一个新的空会话。这是因为如果客户端还没有会话状态包,就会给它一个会话状态包。如果客户端不传输会话cookie,我们将无法识别相同的客户端,因此将一次又一次地向他传递一个新会话。

票数 164
EN

Stack Overflow用户

发布于 2011-02-07 08:40:34

以下陈述并不完全准确:

“因此,如果您要从页面调用其他功能,包括静态类,则应该没问题。”

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

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

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

WebMethod(EnableSession =真)

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

感谢Matthew Cosier的解决方案。

我想补充一下我的两点意见。

边缘

票数 40
EN

Stack Overflow用户

发布于 2011-01-05 10:31:27

如果您的会话实例为空,并且位于'ashx‘文件中,则只需实现'IRequiresSessionState’接口。

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

代码语言:javascript
运行
AI代码解释
复制
public class MyAshxClass : IHttpHandler, IRequiresSessionState
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1382791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档