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 State Service (ASP.NET 状态服务)已启动