c# - 使用SQL存储 session 时,如何捕获 session 状态的连接错误?

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

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

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

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

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

最佳答案

您应该能够在 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 模块针对此请求再次运行并导致另一个异常发生。

编辑

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

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

或者甚至可能只是:

if (Context.Session == null)
如果 Session 模块失败,

Context.Session 应该始终为 null(不幸的是,我找不到任何文档来支持该断言,但在我的测试中确实如此)。

关于c# - 使用SQL存储 session 时,如何捕获 session 状态的连接错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6656191/

相关文章:

c# - 如何在不丢失设置的情况下更新我的应用程序?

c# - 取消 session 的事件?

c# - 访问密封类 C# 中的内部方法

c# - DataContractSerializer 如何写入私有(private)字段?

mysql - 比较当前日期和上个月的日期

c# - 如何执行两次powershell invoke?

c# - MVC4 - 当优化设置为 true 时捆绑不起作用

c# - 测试 asp.net 项目 IHttpHandler , Request.Files 问题

mysql - 如果类别为空,SQL删除类别

sql - 在SQL中查询没有时间的日期时间