Я вижу довольно сумасшедшую ошибку, возникающую при использовании 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. Я не могу надежно воспроизвести проблему, поэтому мне интересно, были ли у кого-нибудь еще такие проблемы с маршрутизацией. Спасибо за любую помощь, которую вы можете предложить.