【问题标题】:How to catch connection errors for session state when it uses SQL to store session?使用 SQL 存储会话时如何捕获会话状态的连接错误?
【发布时间】:2011-07-11 20:34:31
【问题描述】:

我们有一个使用 SQL Server 存储其会话状态的 ASP.NET 应用程序。这很好用,除非它没有;)

我们的数据库服务器由第三方托管,它们会定期对 SQL 服务器进行维护。发生这种情况时,我们希望我们的代码能够优雅地检测数据库连接错误并显示我们正在维护的友好消息。我们编写了一个与每个请求一起运行的 HttpModule,并实例化我们的 Entity Framework 容器的一个实例。如果由于任何原因实例化失败,我们知道存在连接问题,我们会将用户重定向到维护页面。

在我们打开会话状态服务器设置之前,这一切正常。会话状态在此模块运行之前访问其连接字符串。然后我们会收到一个难看的会话状态连接错误。

我们怎样才能捕捉到这个错误?在我们的应用程序中是否有一个地方可以捕获/检测会话状态连接错误并切换到“进程中”会话状态?

【问题讨论】:

    标签: c# asp.net sql session session-state


    【解决方案1】:

    您应该能够在Global.asaxApplication_Error 方法中发现错误。这样的事情会起作用,尽管您可能希望检查异常是否是与 Session 相关的异常更健壮。不幸的是,ASP.NET 不会抛出 SessionException,只是一个包装了 SqlExceptionHttpException

    protected void Application_Error()
    {
        Response.Clear();
        var ex = Server.GetLastError();
        if (ex is HttpException && 
            ex.Message.Contains("Unable to connect to SQL Server session database"))
        {
            Server.Transfer("/Maintenance.aspx");
        }
        else
        {
            Response.Write("Other error occurred.");
            Response.Write(ex.ToString());
            Response.End();
        }
    }
    

    Maintenance.aspx 中,确保将EnableSessionState 页面指令设置为false。您可以使用Server.Transfer 来防止 Session 模块为此请求再次运行并导致另一个异常发生。

    编辑

    做了一些测试,最好使用以下检查来测试会话是否不工作:

    if (ex is HttpException && Context.Session == null)
    

    或者甚至可能只是:

    if (Context.Session == null)
    

    如果 Session 模块失败,Context.Session 应该始终为 null(不幸的是,我找不到任何文档来支持该断言,但在我的测试中就是这种情况)。

    【讨论】:

    • 维护页面实际上是一个 .html 页面,因此会话不应该成为问题。感谢你的回答。我会让这个开放一段时间,看看是否有其他人有任何意见,但如果没有,那么我会接受这个 tmr 下午。谢谢rsbarro :)
    • 这有助于我在无法访问服务器时捕获连接错误。至于上下文,它似乎对我不起作用。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多