mysql - 您如何处理.Net session 提供程序错误?

标签 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行的断点从不触发)。有什么办法可以优雅地处理吗?我似乎找不到任何文档或示例。

最佳答案

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

我的解决方案是为提供程序创建包装器类,如下所示(这是一个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

关于mysql - 您如何处理.Net session 提供程序错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27726761/

相关文章:

php - 多个 LEFT Join 在 mysql 中工作正常但在 php 中不正确

asp.net - 我应该如何在 ASP.NET 中使用 DB4O

c# - 在 jQuery Post 中获取 SessionId

c# - 如何在 ASP.Net MVC 中访问 session 变量

mysql - SQL 函数将一条记录分成两条记录。

javascript - 更新记录而不刷新

c# - Entity Framework 不生成 ApplicationUser 外键

asp.net - 在 ASP :RadioButton 上设置值

ruby-on-rails - Rails - 为每个打开的选项卡/窗口存储唯一数据

MYSQL - 在 TEXT 列中存储 unicode 字符(表情符号)