gpt4 book ai didi

asp.net-mvc - MVC Mini-Profiler 修改 RouteCollection 时抛出 LockRecursionException

转载 作者:行者123 更新时间:2023-12-02 00:03:53 24 4
gpt4 key购买 nike

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

最佳答案

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

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

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

MiniProfiler.Settings.PopupMaxTracesToShow = 10;

关于asp.net-mvc - MVC Mini-Profiler 修改 RouteCollection 时抛出 LockRecursionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10047203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com