【问题标题】:accessing SessionState in Global.Application_Error在 Global.Application_Error 中访问 SessionState
【发布时间】:2008-11-18 20:49:11
【问题描述】:

在 Global.asax 的 Application_Error 方法中,我试图从会话状态中检索一个值。

只要我抛出异常,我就可以访问会话状态。例如:

thow new Exception("Test exception");

但是,如果它是未处理的异常,我在尝试访问会话状态时会收到以下错误:“会话状态在此上下文中不可用。”。

为什么会出现行为差异,是否有解决方法?

谢谢。

【问题讨论】:

  • 这是奇怪的行为。我使用类似的设置来记录异常的表单和会话信息以用于通知目的,没有问题。我会在早上上班时验证这一点。 :)
  • 我不确定我是否遵循了您要执行的操作。如果您手动抛出异常,一切正常吗?您能否提供更完整的代码示例,说明哪些有效,哪些无效?

标签: asp.net session-state global-asax


【解决方案1】:

我有时讨厌 ASP.NET……

因此使用以下命令生成错误:

Response.Redirect("thispagedoesnotexist.aspx", false); 

以上行将重定向到 Application_Error 且会话状态不可用

然而

throw new Exception("test");

以上行将重定向到会话状态为 AVAILABLE 的 Application_Error

因此,与其在 Application_Error 中做这一切,我将不得不在我的代码中使用 try/catch 来捕获错误。然后从会话、日志和电子邮件错误详细信息中收集数据,最后重定向到友好的错误页面。很多额外的代码..

结论:Application_Error 毫无价值。

【讨论】:

  • 1.如果您知道页面生命周期,您提到的案例是相当直观的。在第二种情况下,您会在循环的底部抛出一个异常,其中填充了请求状态,而在第一种情况下,请求将没有机会这样做。 2. 对于您的错误处理情况,请使用 ELMAH。它为您完成所有收集/发送电子邮件。没有额外的代码。
【解决方案2】:

我认为您正在尝试通过 HttpContext.Current.Session 访问会话。我相信行为上的区别在于,在未处理的异常处理程序中,请求已进入“故障安全”模式,并且页面生命周期(包括加载和处理会话)已完成。

查看lifecycle 上的此页面了解更多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多