如何在使用SQL存储会话时捕获会话状态的连接错误?

Che*_*hev 4 c# sql asp.net session session-state

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

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

这工作正常,直到我们打开会话状态服务器设置.会话状态在运行此模块之前访问其连接字符串.然后,我们得到会话状态的丑陋连接错误.

我们怎样才能发现这个错误?我们的应用程序中是否有一个位置可以捕获/检测会话状态连接错误并切换到"进程中"会话状态?

rsb*_*rro 10

你应该能够捕获Application_Error方法中的错误Global.asax.这样的东西会起作用,尽管您可能想要检查异常是否与会话相关的异常更加健壮.不幸的是,ASP.NET不会抛出一个SessionException,只是一个HttpException包装了一个SqlException.

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Maintenance.aspx确保您设置的EnableSessionState页面指令false.您可以使用a Server.Transfer来阻止会话模块再次为此请求运行并导致发生另一个异常.

编辑

做了一点测试,并且最好使用以下检查来测试会话是否不起作用:

if (ex is HttpException && Context.Session == null)
Run Code Online (Sandbox Code Playgroud)

或者甚至可能只是:

if (Context.Session == null)
Run Code Online (Sandbox Code Playgroud)

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