【问题标题】:How to check if asp session is valid?如何检查asp会话是否有效?
【发布时间】:2010-11-23 21:15:24
【问题描述】:

我正在使用由 aspnet_state 管理的 outproc 会话。有时我会收到运行时错误,说会话无效。所以我想检查会话是否对我提出的每个请求都有效。但是我找不到像this Question 那样使用Java 的正确方法。

这是我现在在 page_preinit 事件中使用的代码。它看起来很难看,但它可以工作。

            Try
                Dim x = Session.Keys().Item(0)
            Catch ex As Exception
                Session.Clear()
            End Try

有人知道更好的方法吗?

谢谢

【问题讨论】:

  • 您得到的确切运行时消息是什么?它不会敲响警钟,您使用上述方法进行测试的方式是基于空引用异常,这也将发生在新/空会话而不是无效会话中。
  • 你在使用表单认证吗?
  • olle:会话确实存在(非空),但访问任何元素都会引发异常。这只会不时发生,并且仅在我的开发机器上发生,因为我进行了大量的构建/重建
  • PortageMonkey:不,我没有使用身份验证

标签: asp.net session


【解决方案1】:

您可以尝试检查上下文对象。

C#

if(Context.Session != null)
{
    //Redirect to login page etc
}

VB(这里使用了 C# 到 VB 转换器。不确定这是否正确)

If Context.Session IsNot Nothing Then
    'Redirect to login page etc
End If

如果您使用表单身份验证并且设置正确,它应该会为您重定向。如果您仍需要明确说明,我建议将此类代码放在 Global.asax 或您的每个页面都可以派生的基类中,而不是将其添加到每个请求中。

【讨论】:

  • 我使用的代码在基本页面上。但是会话确实存在,它不为空。访问 eny 元素将引发异常。通过简单地重新启动 asp_net 会话,问题就出现了,或者在我清理它的代码中。我正在使用的代码确实解决了我的问题,但我想知道是否还有其他方法可以解决。
  • 嗯。这听起来像是会话信息(密钥)没有正确填充的问题......而不是会话超时。我们在使用 aspnet_state DB 时也遇到过类似的问题。除了检查 null 以验证 aspnet_state DB 是否返回了有效的会话对象之外,我们的方法是尝试访问会话密钥。至于 aspnet_state DB 返回的错误会话的根本问题......仍然没有解决这个问题
【解决方案2】:

实际上我通过检查会话的第一个元素( session.item(0) )解决了这个问题 我把代码放在 try catch 中。如果有异常我只是清除会话。此代码位于我所有页面的基本页面中。

所以在 preinit 事件中我的代码看起来像这样

Private Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
    Try
        Dim x = Session.Keys().Item(0)
    Catch ex As Exception
        Session.Clear()
    End Try
End Sub

它看起来很丑,但它确实解决了我的问题。

谢谢大家。

【讨论】:

    【解决方案3】:

    只需检查 Session.Count 而不是尝试访问错误处理块中的第一项...

    【讨论】:

    • 不,计数没有帮助,因为计数是正确的。会话中有元素,但由于某种原因它们已损坏。您可以在它运行一段时间(频繁访问)后使用 out proc session 复制它,它会开始崩溃。这可能是内存问题。我没有彻底调查它,但 try catch 对我来说很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多