我们有一个使用 SQL Server 来存储其 session 状态的 ASP.NET 应用程序。这很好用,除非它没有;)
我们的数据库服务器由第三方托管,他们会定期对 SQL 服务器进行维护。当发生这种情况时,我们希望我们的代码能够优雅地检测数据库连接错误并显示一条友好的消息,表明我们正在维护中。我们编写了一个 HttpModule,它随每个请求一起运行,并实例化我们的 Entity Framework 容器的一个实例。如果实例化因任何原因失败,我们知道存在连接问题,我们会将用户重定向到维护页面。
在我们打开 session 状态服务器设置之前,一切正常。在此模块运行之前, session 状态会访问其连接字符串。然后我们会收到一个丑陋的 session 状态连接错误。
我们怎样才能捕捉到这个错误?我们的应用程序中是否有一个地方可以捕获/检测 session 状态连接错误并切换到“进程中” session 状态?
最佳答案
您应该能够在 Global.asax
的 Application_Error
方法中捕获错误。这样的事情会起作用,尽管您可能希望检查异常是否是与 session 相关的异常更可靠。不幸的是,ASP.NET 不会抛出 SessionException,只会抛出一个包含 SqlException
的 HttpException
。
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/