使用 MVC MiniProfiler时,我看到一个非常疯狂的错误。间歇性地,我正在处理的站点进入每个请求都会引发此异常的状态:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
---> System.TypeInitializationException: The type initializer for 'MvcMiniProfiler.MiniProfiler' threw an exception.
---> System.Threading.LockRecursionException: Write lock may not be acquired with read lock held.
This pattern is prone to deadlocks. Please ensure that read locks are released before taking a write lock.
If an upgrade is necessary, use an upgrade lock in place of the read lock.
at System.Threading.ReaderWriterLockSlim.TryEnterWriteLockCore(Int32 millisecondsTimeout)
at System.Threading.ReaderWriterLockSlim.TryEnterWriteLock(Int32 millisecondsTimeout)
at System.Web.Routing.RouteCollection.GetWriteLock()
at MvcMiniProfiler.UI.MiniProfilerHandler.RegisterRoutes()
in C:\Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\UI\MiniProfilerHandler.cs:line 81
at MvcMiniProfiler.MiniProfiler..cctor()
in C:\Users\sam\Desktop\mvc-mini-profiler\MvcMiniProfiler\MiniProfiler.cs:line 241
— End of inner exception stack trace —
at MvcMiniProfiler.MiniProfiler.get_Current()
at TotallyNotOverDrive.Boom.MvcApplication.Application_EndRequest()
错误一直存在,直到应用程序池被回收。看起来好像有一个锁被持有,它阻止了 MiniProfiler 尝试注册它的路由。这发生在我没有启动 MiniProfiler 但在Application_EndRequest
我调用期间的请求中MiniProfiler.Stop()
,这似乎导致在访问 Current 属性时创建 MiniProfiler。对于一个简单的解决方案,我修改了 EndRequest 以使用与 BeginRequest 相同的逻辑来停止分析器,因此如果请求未使用分析器,则应完全避免此错误。在将此代码发送到生产环境之前,我仍然想解决实际问题。
我的路由表非常简单,只添加到Application_Start
方法中。我们没有使用任何其他可能在启动后修改路由表的第三方代码。我对路由所做的唯一可疑的事情是将自定义路由添加到表中,但这是一个非常简单的路由,我只需要一些比标准 MVC 路由可以完成的更复杂的模式匹配。
我查看了相关的 MiniProfiler 代码,没有看到任何可能导致锁未释放的内容,所以我假设它是 ASP.NET 和 MiniProfiler 在访问 RouteTable 时发生冲突的组合。我无法可靠地重现该问题,所以我想知道是否有其他人在路由方面遇到过这样的问题。谢谢你的尽心帮助。