我们正在使用自定义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行的断点永远不会触发)。有没有办法优雅地处理这个问题?我似乎无法找到任何文档或示例。
答案 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