8

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

if (Session != null)
{
    Session.Remove("foo");
}

会抛出这个异常:

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

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

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

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

4

5 回答 5

10

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

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

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

于 2009-07-14T13:58:19.340 回答
3

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

但它应该在 Page_Load() 中可用,因此指向其他地方的问题:)

于 2009-07-14T13:39:09.537 回答
0

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

于 2009-07-14T13:30:52.493 回答
0

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

还要检查 web.config 文件中的标记<pages />,并将其更新为包括 -

<pages enableSessionState="true" />

参考:这里

于 2009-07-14T13:32:56.783 回答
0

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

于 2009-07-14T13:39:40.503 回答