2012-04-06 2 views
7

MVCを使用するとかなり狂ったエラーが表示されますMiniProfiler。アプリケーションプールがリサイクルされるまでRouteCollectionを変更すると、MVC Mini-ProfilerがLockRecursionExceptionをスローします

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の組み合わせだと仮定しています何も表示されません。私は問題を確実に再現することができないので、他の誰かがルーティングのような問題を抱えているのだろうかと思います。あなたが提供できるお手伝いをありがとう。

答えて

1

私は何が起こっているのかと思う、以前登録したルートを取得する必要があります。 EndRequestの間にそれらを登録していますが、この時点でルートテーブルに読み取りロックを保持している他の要求がパイプラインに存在することがあります。

経路は、MiniProfilerという静的コンストラクタに登録されています。 Application_Startの間にMiniProfilerのいずれかの設定にアクセスすると、ルートを登録する静的コンストラクタが起動します。

たとえば、ルートを登録した直後に、このようなものを追加してみてください。

MiniProfiler.Settings.PopupMaxTracesToShow = 10;

+1

私はのApplication_StartでMiniProfiler.Currentへの呼び出しを追加してみました、そして、それはその変化が再び失敗していません。再現するのは難しかったので、確かめるためにはもっと時間をかけなければなりません。わたしにとって混乱する部分は、アプリが既にリクエストを出してから失敗していたので、ルートはすでに登録されているはずです。アプリプールが眠ってしまったときにそれを見つけたかもしれないので、もう一度起動する必要がありました。 – nslowes

関連する問題