ASP .NET 检查会话

Posted

技术标签:

【中文标题】ASP .NET 检查会话【英文标题】:ASP .NET Check for Session 【发布时间】:2009-07-14 13:26:44 【问题描述】:

我想在使用它之前检查一个基页面类中的Session是否存在,但是我发现如果它不存在,只需检查它就会抛出异常:

if (Session != null)

    Session.Remove("foo");

会抛出这个异常:

会话状态只能在 enableSessionState 设置为 true 时使用,无论是在 配置文件或在 Page 指令中。还请确保 System.Web.SessionStateModule 或自定义会话状态模块包含在 \\ 应用程序配置中的部分。

检查发生在我的所有 aspx 页面派生自的基页面类的 Load 事件中。该应用程序启用了会话,并且它在 httpModules 节点中列出了模块。这是一个经常使用会话的应用,通常没有问题。

我只在某些页面上收到此错误,而且大多数情况下它并不可靠。我知道我应该做一些不同的事情来防止错误,但我不确定是什么?

我是否在生命周期中过早地调用 Session? 我是否没有正确检查会话是否可用?

【问题讨论】:

【参考方案1】:

您可以使用这样的方法来确定当前请求是否使用会话:

    public static bool RequestHasSession
    
        get
        
            return (HttpContext.Current.Handler is IRequiresSessionState);
        
    

如果您不确定自己是否在 Web 上下文中运行,则需要事先检查 HttpContext.Current 是否为空。

【讨论】:

IReadOnlySessionState 继承 IRequiresSessionState,因此您只需检查 HttpContext.Current.Handler is IRequiresSessionState【参考方案2】:

您可以使您的检查更安全 - Page.Session 围绕 Context.Session 属性包装了一个空检查。所以你应该能够检索 Context.Session 并检查它是否为空。如果是,则会话状态不可用。

但它应该在 Page_Load() 中可用,以便指出其他地方的问题:)

【讨论】:

【参考方案3】:

您没有遇到异常,因为某个 Session 变量为空,而只是通过在未配置为与会话状态服务器通信的页面上使用 Session 逻辑(这在某些情况下是有意义的,实际上是不同的机器)。如果这对您来说不是问题,请考虑确保始终将 enableSessionState 设置为 true。

【讨论】:

【参考方案4】:

尝试检查HttpContext.Current.Session,甚至HttpContext.Current(我在单元测试中经常这样做,当从 ASP.NET 调用组件时,我得到了这些变量,但是当我从 NUNIT 调用它们时 我没有它们)

【讨论】:

【参考方案5】:

您是否检查了页面指令的 enableSessionState 属性引发错误的页面?您可以通过转到 .aspx 页面并检查 enableSessionState 属性是否设置为 true/false 来做到这一点。如果设置为false,则设为true

同时在 web.config 文件中检查标签 <pages />,并将其更新为包含 -

<pages enableSessionState="true" />

参考:Here

【讨论】:

enableSessionState 应该是页面类的属性吗?我只将 enableViewState 视为一个属性。

以上是关于ASP .NET 检查会话的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 4 和会话安全漏洞

无法向会话状态服务器发出会话状态请求请。确保 ASP.NET State Service (ASP.NET 状态服务)已启动

如何检查 Net::Telnet 会话是不是仍在 Perl 中?

asp.net 检查 imageURL 是不是存在

无法向会话状态服务器发出会话状态请求

ASP.NET Identity Custom PasswordValidator 检查用户名