7

使用 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 时发生冲突的组合。我无法可靠地重现该问题,所以我想知道是否有其他人在路由方面遇到过这样的问题。谢谢你的尽心帮助。

4

1 回答 1

1

我想我知道发生了什么,您需要提前注册路线。您在 期间注册它们EndRequest,此时管道中可能有其他请求在路由表上持有读锁。

路由在 的静态构造函数中注册MiniProfiler。如果您在 期间访问 MiniProfiler 中的任何设置Application_Start,这将启动将注册路由的静态构造函数。

例如,尝试在注册路线后添加类似的内容。

MiniProfiler.Settings.PopupMaxTracesToShow = 10;

于 2012-04-11T23:54:31.393 回答