Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当会话使用SQL存储会话时,如何捕获会话状态的连接错误?_C#_Asp.net_Sql_Session_Session State - Fatal编程技术网

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

C# 当会话使用SQL存储会话时,如何捕获会话状态的连接错误?,c#,asp.net,sql,session,session-state,C#,Asp.net,Sql,Session,Session State,我们有一个ASP.NET应用程序,它使用SQL Server存储其会话状态。这非常有效,除非它不起作用;) 我们的数据库服务器由第三方托管,它们定期在SQL server上执行维护。当这种情况发生时,我们希望我们的代码能够优雅地检测数据库连接错误,并显示一条友好的消息,说明我们正在维护中。我们编写了一个HttpModule,它与每个请求一起运行,并实例化实体框架容器的一个实例。如果实例化因任何原因失败,我们知道存在连接问题,并将用户重定向到维护页面 在打开会话状态服务器设置之前,这一切都很正常。

我们有一个ASP.NET应用程序,它使用SQL Server存储其会话状态。这非常有效,除非它不起作用;)

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

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


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

您应该能够在
Global.asax
中的
application\u error
方法中捕获错误。类似这样的方法会起作用,不过您可能希望检查异常是否是与会话相关的异常,使其更加健壮。不幸的是,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
。您可以使用
服务器.Transfer
来防止会话模块为此请求再次运行并导致另一个异常发生

编辑

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

if (ex is HttpException && Context.Session == null)
甚至可能只是:

if (Context.Session == null)

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

维护页面实际上是一个.html页面,因此会话不应成为问题。谢谢你的回答。我会让这个打开一段时间,看看是否有其他人有任何意见,但如果没有,那么我将接受今天下午的tmr。感谢rsbarro:)这有助于我在无法访问服务器时捕获连接错误。至于上下文,它似乎不适合我。谢谢