2012-04-06 13 views
7

संशोधित करते हैं तो मैं एमवीसी 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 को अपने मार्गों को पंजीकृत करने से रोकने से रोकता है। यह उन अनुरोधों के लिए होता है जहां मैं मिनीप्रोफाइलर शुरू नहीं कर रहा हूं, लेकिन Application_EndRequest के दौरान मैं MiniProfiler.Stop() पर कॉल करता हूं, जिसके परिणामस्वरूप मिनी प्रॉपॉइलर बनता है जब वर्तमान संपत्ति का उपयोग किया जाता है। एक साधारण समाधान के लिए, मैंने EndRequest को WinRequest के रूप में प्रोफाइलर को रोकने के लिए एक ही तर्क का उपयोग करने के लिए संशोधित किया, इसलिए यदि अनुरोध प्रोफाइलर का उपयोग नहीं कर रहा है तो यह त्रुटि पूरी तरह से टालना चाहिए। मैं इस कोड को उत्पादन में भेजने से पहले भी वास्तविक समस्या को हल करना चाहता हूं।

मेरी मार्ग तालिका बहुत सरल है, और इसे केवल Application_Start विधि में जोड़ा गया है। हम किसी अन्य तृतीय-पक्ष कोड का उपयोग नहीं कर रहे हैं जो स्टार्टअप के बाद रूट तालिका को संशोधित कर सकता है। रूटिंग के साथ मैंने किया एकमात्र संदिग्ध चीज तालिका में एक कस्टम रूट जोड़ती है, लेकिन यह एक बहुत ही सरल मार्ग है, मुझे मानक एमवीसी मार्ग की तुलना में बस कुछ और जटिल पैटर्न मिलान की आवश्यकता है।

मैंने प्रासंगिक मिनीप्रोफाइलर कोड को देखा और कुछ भी नहीं देखा जो लॉक को बिना रिलीज़ होने का कारण बन सकता है, इसलिए मुझे लगता है कि यह रूटटेबल तक पहुंचने पर एएसपी.नेट और मिनीप्रोफाइलर का एक संयोजन है। मैं विश्वसनीय रूप से समस्या का पुनरुत्पादन नहीं कर सकता, इसलिए मैं सोच रहा हूं कि किसी और को रूटिंग के साथ इस तरह की समस्याएं हैं। आप जो भी सहायताकर सकें, उसके लिए धन्यवाद।

उत्तर

1

मुझे लगता है कि मैं देख रहा हूं कि क्या हो रहा है, आपको पहले पंजीकृत मार्ग प्राप्त करने की आवश्यकता है। आप EndRequest के दौरान उन्हें पंजीकृत कर रहे हैं, इस बिंदु पर पाइपलाइन में अन्य अनुरोध हो सकते हैं जो रूट टेबल पर पढ़ने वाले ताले रख रहे हैं।

मार्ग MiniProfiler के स्थिर निर्माता में पंजीकृत हैं। यदि आप Application_Start के दौरान मिनीप्रोफाइलर में से किसी भी सेटिंग तक पहुंचते हैं, तो यह स्थिर कन्स्ट्रक्टर को बंद कर देगा जो मार्गों को पंजीकृत करेगा।

उदाहरण के लिए, अपने मार्गों को पंजीकृत करने के बाद, इस तरह कुछ जोड़ने का प्रयास करें।

MiniProfiler.Settings.PopupMaxTracesToShow = 10;

+1

मैं Application_Start में MiniProfiler.Current के लिए एक कॉल जोड़ने की कोशिश की है, और यह है कि परिवर्तन के बाद से फिर से असफल रहे नहीं किया है। पुनरुत्पादन करना मुश्किल था, इसलिए मुझे यह सुनिश्चित करने के लिए और अधिक समय देना होगा। मेरे लिए भ्रमित हिस्सा यह है कि ऐप पहले से ही कुछ अनुरोधों की सेवा करने के बाद विफल रहा था, इसलिए मार्गों को एक बार पहले ही पंजीकृत होना चाहिए था। यद्यपि हमने ऐप पूल सो जाने के दौरान इसे पकड़ा था, इसलिए इसे फिर से शुरू करना पड़ा। – nslowes

संबंधित मुद्दे