我们正在使用自定义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/