你如何处理.Net会话提供程序错误?

时间:2014-12-31 22:08:42

标签: mysql asp.net session session-state

我们正在使用自定义sessionState提供程序,以便我们可以在MySQL中存储会话:

<sessionState mode="Custom" cookieless="false" timeout="15" cookieName="ASP.NET_SessionId" regenerateExpiredSessionId="true" customProvider="MySqlSessionStateProvider">
  <providers>
    <add name="MySqlSessionStateProvider" type="MySql.Web.SessionState.MySqlSessionStateStore, MySql.Web, Version=6.9.5.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" applicationName="appName" description="" connectionStringName="appConnStr" writeExceptionsToEventLog="False" autogenerateschema="True" enableExpireCallback="False" />
  </providers>
</sessionState>

一切运作良好,但我正在努力提前计划维护期和真正的停机时间。

我正在尝试捕获提供程序抛出的异常,以防它无法连接到服务器。现在,如果我关闭连接(或在连接字符串中输入错误的主机名等),我得到:

  “/”应用程序中的服务器错误。

  配置错误

  描述:处理为此请求提供服务所需的配置文件时发生错误。请查看下面的具体错误详细信息并相应地修改配置文件。

     

分析程序错误消息:无法连接到任何指定的MySQL主机。

我查看了MySqlSessionStateStore提供程序代码,我可以看到它抛出ProviderExceptions。我读了一些人的建议,这是在Application_Error中处理的,但我看不到它到达那里(第1行的断点永远不会触发)。有没有办法优雅地处理这个问题?我似乎无法找到任何文档或示例。

1 个答案:

答案 0 :(得分:0)

似乎提供程序代码抛出的任何异常都将导致“服务器错误...”屏幕。一旦发生这种情况,您将无法处理错误。

我的解决方案是为提供程序创建一个包装类,就像这样(这是一个VB.NET项目):

Import MySql.Web.SessionState

Public Class MySessionWrapper
    Inherits MySqlSessionStateStore

    Protected Shared _caughtException As Exception

    Public Shared ReadOnly Property Exception As Exception
        Get
            Return _caughtException
        End Get
    End Property

    Public Shared ReadOnly Property HasException As Boolean
        Get
            Return _caughtException IsNot Nothing
        End Get
    End Property

    Public Shared Sub ClearException()
        _caughtException = Nothing
    End Sub

    Public Overrides Sub Initialize(name As String, config As NameValueCollection)
        Try
            If _caughtException Is Nothing Then
                MyBase.Initialize(name, config)
            End If
        Catch ex As Exception
            _caughtException = ex
        End Try
    End Sub
End Class

这会记录发生的事情,抑制错误并继续。如果您应该选择,请以类似的方式重载类的其他方法。

由于压缩记录,其他代码将失败,您可以在Application_Error代码中捕获它,如下所示:

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
    If MySessionWrapper.HasException Then
        ' Do whatever you choose here, I log using NLog
        log.Fatal("The session state provider has encountered an error", MySessionWrapper.Exception)

        MySessionWrapper.ClearError()
        Server.ClearError()

        Server.Transfer("Error.aspx")
    Else
        ' It is not a session provider error, handle differently
    End If
End Sub