asp.net - 如果当前 ASP.NET session 为空怎么办?

标签 asp.net session

在我的网络应用程序中,我执行类似的操作来读取 session 变量:

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

我明白为什么检查 HttpContext.Current.Session["MyVariable"] 为空的原因很重要(该变量可能尚未存储在 session 中,或者 session 已因各种原因被重置),但为什么我要这样做需要检查 HttpContext.Current.Session 是否为 null?

我的理解是 session 是由 ASP.NET 自动创建的,因此 HttpContext.Current.Session 永远不应该为 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?
}

最佳答案

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

如果您只有页面中的代码,则不会遇到这种情况。我的大部分 ASP .NET 代码都使用 Session,而不重复检查 null。然而,如果您正在开发 IHttpModule 或以其他方式陷入 ASP .NET 的更具体细节,则需要考虑这一点。

编辑

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

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

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

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

关于asp.net - 如果当前 ASP.NET session 为空怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1382791/

相关文章:

javascript - ASP.Net 中下拉框的数据绑定(bind)

python - 使用 requests.get() 时缺少 Cookie 的某些部分?

当 URL 前面没有 WWW 时,PHP session cookie 似乎消失了

PHP: session 在 header 重定向之前不保存

session - 注销时具有数据库 session 1.2.0和Spring安全核心的Grails 2.1中的InvalidatedSessionException

javascript - 如何在不向元素添加 runat=server 的情况下修改 ASP.NET 页面中的 HTML 和 BODY 标记?

asp.net - 如何将自定义属性设置为 asp.net 文字并在后面的代码中读取它?

javascript - 在带有数据的表中正确使用类与 ID

C#.NET,回发发生在事件处理程序执行之前?

php session 变量在下一页丢失