【问题标题】:Session state is not available in this context会话状态在此上下文中不可用
【发布时间】:2011-10-19 21:42:55
【问题描述】:

我想在应用程序错误事件中读取会话 ID,但总是收到错误“会话状态在此上下文中不可用”。为什么?奇怪的是,我在另一个 asp.net 应用程序中有相同的代码,并且一切正常。

void Application_Error(object sender, EventArgs e)
{

        var sessionId = Session.SessionID;
        //skipped code

}

【问题讨论】:

标签: asp.net session


【解决方案1】:

会话对象可能不可用,这取决于错误发生的时间。

例如,如果 Begin_Request 发生错误,则会话将不可用,因为它尚未创建。

所以总而言之,有时它会起作用,有时它会不起作用,这取决于错误发生的时间。

最好在访问会话 ID 之前检查会话对象的状态,例如

HttpContext context = HttpContext.Current;

if (context != null && context.Session != null) ...

【讨论】:

  • 另外 HttpContext.Current 可能为空,因此 if 子句应为:if (context != null && context.Session != null)
  • 值得注意的是,检查Context 然后Context.Session 是否为空可以避免异常。当直接从应用程序对象访问Session 时,如果不可用,则会引发异常,而不是产生null。见stackoverflow.com/a/6021261/1178314
【解决方案2】:

Application_error 可以在会话不存在的情况下触发,例如当垃圾收集器清理时。错误的来源可能不是用户线程。

先检查session是否为null。

西蒙

【讨论】:

    【解决方案3】:

    检查 c# 中是否缺少任何事件,这些事件映射到设计部分中的控件或问题

    【讨论】:

      【解决方案4】:

      如果您为 ASP.NET 状态服务器使用进程外状态模式,您可能会收到此错误。您需要使用[Serializable] 属性标记您希望保存到会话状态的任何类

      【讨论】:

        猜你喜欢
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 2013-10-19
        • 1970-01-01
        • 2013-08-02
        • 1970-01-01
        • 2021-03-02
        • 1970-01-01
        相关资源
        最近更新 更多