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 が作成されるようです。簡単な解決策として、プロファイラーを停止するために BeginRequest と同じロジックを使用するように EndRequest を変更しました。そのため、リクエストがプロファイラーを使用していない場合、このエラーは完全に回避されます。このコードを本番環境に送信する前に、実際の問題を解決したいと思います。
Application_Start
私のルート テーブルは非常に単純で、メソッド内でのみ追加されます。起動後にルート テーブルを変更する可能性のある他のサードパーティ コードは使用していません。ルーティングに関して私が行った唯一の疑わしいことは、カスタム ルートをテーブルに追加することですが、これは非常に単純なルートであり、標準の MVC ルートが達成できるよりも複雑なパターン マッチングが必要でした。
関連する MiniProfiler コードを調べたところ、ロックが解放されない原因となる可能性のあるものは何も表示されないため、RouteTable にアクセスするときに ASP.NET と MiniProfiler の競合の組み合わせであると想定しています。問題を確実に再現することはできないので、他の誰かがルーティングでこのような問題を抱えているかどうか疑問に思っています. ご協力いただきありがとうございます。