MVC Mini-Profiler создает LockRecursionException при изменении RouteCollection

Я вижу довольно сумасшедшую ошибку, возникающую при использовании 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(), что, по-видимому, приводит к созданию MiniProfiler при доступе к свойству Current. .В качестве простого решения я изменил EndRequest, чтобы использовать ту же логику для остановки профилировщика, что и BeginRequest, поэтому, если запрос не использует профилировщик, этой ошибки следует полностью избежать. Я все же хотел бы решить реальную проблему, прежде чем отправлять этот код в производство.

Моя таблица маршрутов довольно проста и добавляется только в метод Application_Start. Мы не используем какой-либо другой сторонний код, который может изменять таблицу маршрутов после запуска. Единственная подозрительная вещь, которую я сделал с маршрутизацией, — это добавление пользовательского маршрута в таблицу, но это довольно простой маршрут, мне просто нужно было более сложное сопоставление с образцом, чем может выполнить стандартный маршрут MVC.

Я просмотрел соответствующий код MiniProfiler и не нашел ничего, что могло бы привести к тому, что блокировка не будет снята, поэтому я предполагаю, что это комбинация ASP.NET и MiniProfiler, конфликтующих при доступе к RouteTable. Я не могу надежно воспроизвести проблему, поэтому мне интересно, были ли у кого-нибудь еще такие проблемы с маршрутизацией. Спасибо за любую помощь, которую вы можете предложить.

7
задан Iman 16 April 2012 в 12:04
поделиться