में चल रहा है इसमें व्याख्या करने में कुछ समय लग सकता है, लेकिन यहां मैं जाता हूं :)।नियंत्रक क्रियाएं कई बार हिट होती हैं - एएसपी.नेट एमवीसी 4 ऐप एज़ूर एमुलेटर
मैं दो Visual Studio 2012 परियोजनाओं बनाया: (वेब -> ASP.NET MVC 4 वेब अनुप्रयोग)
- का उपयोग कर एक परियोजना दृश्य स्टूडियो के में टेम्पलेट परियोजना जोड़े संवाद। मैंने यूनिट टेस्ट प्रोजेक्ट नहीं जोड़ा।
- Azure क्लाउड सेवा टेम्पलेट (क्लाउड -> विंडोज़ Azure क्लाउड सेवा) का उपयोग कर एक प्रोजेक्ट। मैंने एक भूमिका निभाई, एक एएसपी.नेट एमवीसी 4 वेब रोल, और फिर एक यूनिट टेस्ट प्रोजेक्ट नहीं जोड़ा।
मैंने इन दोनों परियोजनाओं को पूरी तरह से छीन लिया जिस तरह से विजुअल स्टूडियो ने उन्हें मेरे लिए बनाया था।
प्रत्येक परियोजना के लिए, मैं तो HomeController
वर्ग के पास गया और About
और Contact
कार्रवाई विधियों (बोरिंग कार्रवाई है कि सिर्फ एक दृश्य वापसी) में से प्रत्येक में एक ब्रेकपाइंट निर्धारित किया है। उदाहरण के लिए, मैं विधि में केवल लाइन पर एक ब्रेकपाइंट सेट:
public ActionResult About()
{
return View();
}
मैं तो पहली परियोजना (गैर Azure परियोजना) डिबगिंग शुरू कर दिया। सब कुछ अपेक्षित था - यानी जब मैं ब्राउजर का उपयोग के बारे में और संपर्क पृष्ठों के बीच नेविगेट करने के लिए करता हूं, तो संबंधित कार्रवाई विधियों में ब्रेकपॉइंट प्रत्येक अनुरोध पर एक बार मारा जाएगा। मुझे ठीक लगता है।
मैंने फिर Azure प्रोजेक्ट को डीबग करना शुरू कर दिया। मैंने के बारे में और संपर्क पृष्ठों के बीच नेविगेट करने की एक ही प्रक्रिया का पालन किया। इस बार मुझे दिलचस्प गैर-निर्धारक व्यवहार मिला। कुछ अनुरोधों पर, पृष्ठ को प्रस्तुत करने से पहले कार्रवाई विधि में ब्रेकपॉइंट कई बार (कभी-कभी दो बार से अधिक) मारा जाएगा। कभी-कभी अनुरोध केवल लटका होगा और पृष्ठ प्रस्तुत नहीं करेगा (प्रतीक्षा के कुछ मिनटों के बाद भी)।
मुझे यह जानना है कि यह क्यों हो रहा है, क्योंकि यह एक और Azure एमवीसी अनुप्रयोग में अधिक जटिल चीजों को प्रभावित कर रहा है जिस पर हम काम कर रहे हैं (उदाहरण के लिए इस समस्या के कारण आवेदन दो या दो से अधिक उदाहरण बनाने का प्रयास कर सकता है एक अनुरोध के लिए मेरे डेटाबेस में एक मॉडल ऑब्जेक्ट)।
मैं निम्नलिखित वातावरण में कर रहा हूँ: Visual Studio 2012
- Windows 8 प्रो (64)
- Visual Studio 2012 अंतिम
- विंडोज Azure एसडीके IIS 8 एक्सप्रेस
- फायरबग के साथ फ़ायरफ़ॉक्स ब्राउज़र (आईई का उपयोग कर व्यवहार की पुष्टि भी)
- एसक्यूएल सर्वर 2012 (वास्तव में मुझे अनुमान नहीं है)
केवल दिलचस्प बात यह है कि मैंने देखा है कि निम्न चेतावनी संदेश जब भी मैं Azure परियोजना डिबग दृश्य स्टूडियो में आउटपुट विंडो में आता है:
में 81 को निजी पोर्ट 80 पुन: मापन अनुकरण के दौरान संघर्ष से बचने के लिए 'My_Web_Role_Name' भूमिका।
शायद इस रीमेपिंग के साथ कुछ करने के लिए कुछ है। फिर फिर, netstat -ano
करने के बाद मैंने देखा कि एज़ूर डेवलपमेंट फैब्रिक प्रक्रिया पोर्ट 80 पर सुन रही है, इसलिए शायद यही कारण है कि इसे रीमेपिंग करने की ज़रूरत है ... काफी उचित लगता है।
वैसे भी, मुझे उम्मीद है कि किसी को यह विचार हो सकता है कि इस व्यवहार के कारण क्या हो सकता है। यहाँ कुछ अतिरिक्त अंक हैं और दृष्टिकोण मैंने कोशिश की:
- रीसेट आईआईएस, पुनः आरंभ Azure कंप्यूट/भंडारण एमुलेटर, पूरे मशीन
- पट्टी को पुनः आरंभ सभी स्क्रिप्ट के विचारों का (यानी व्यवहार अभी भी वहाँ है, तो पृष्ठों बस है उन पर एक बुनियादी HTML अनुच्छेद)
- मैंने प्रासंगिक आईआईएस एक्सप्रेस लॉग फ़ाइलों को खोजने की कोशिश की, लेकिन ऐसा लगता है कि Azure परियोजनाएं अन्य परियोजनाओं की तरह आईआईएस एक्सप्रेस के माध्यम से नहीं चलती हैं (क्या यह सही है?)।
- मैंने एज़ूर कंप्यूट एमुलेटर कंसोल की निगरानी की ... वहां कुछ भी दिलचस्प नहीं है।
तो ... अंत में, कुछ सवाल:
- किसी और इस व्यवहार को पुनः कर सकते हैं?
- क्या एज़ूर एमुलेटर द्वारा उत्पन्न कोई अतिरिक्त लॉग है जो मेरी मदद कर सकता है?
मैं वास्तव में यहां सही दिशा में एक धक्का की सराहना करता हूं :)।
चीयर्स!
संपादित
यहाँ कुछ अधिक जानकारी (के रूप में मैं इस समस्या को डिबग करने के लिए जारी रखने के लिए मैं इस सवाल को अद्यतन करने कर रहा हूँ) है:
मैं डिबगिंग के बिना समाधान चलाने का फैसला किया है, और मैं कुछ सरल में डाल दोनों About
और Contact
कार्रवाई तरीकों में डिबग संदेश, उदाहरण के लिए:
public ActionResult About()
{
System.IO.File.AppendAllText(@"c:\Logs\azure.log", DateTime.Now + ": Contact, thread " + System.Threading.Thread.CurrentThread.ManagedThreadId + "\r\n");
return View();
}
मैं इस फ़ाइल और भी स्टार के Tail संलग्न HTTP पर क्या चल रहा था यह देखने के लिए Fiddler पर टेड करें।
पूंछ से:: फिर से दो About
और Contact
लिंक के बीच नेविगेट करना, मैं निम्नलिखित उत्पादन देखा
- ...
- 9/12/2012 12:14:07 PM: के बारे में, धागा 7
- 9/12/2012 12:14:08 PM पर: संपर्क, धागा 7
- 9/12/2012 12:14: 09 बजे: के बारे में, धागा 7
- 9/12/2012 12:14:10 PM पर: संपर्क, धागा 7
- 9/12/2012 12:14:11 PM: के बारे में, धागा 6
- 9/12/2012 12:14:12 अपराह्न: संपर्क, धागा 8
- 9/12/2012 12:14:31 अपराह्न: संपर्क, धागा 7
- 9/12/2012 12:14:50 PM पर: संपर्क, धागा 7
- 9/12/2012 12:15:03 PM: के बारे में, धागा 7
- 9/12/2012 12: 15:05 PM: संपर्क, धागा 8
- 9/12/2012 12:15:23 PM: के बारे में, धागा 6
- 9/12/2012 12:15:42 PM: के बारे में, धागा 14
- 9/12/2012 12:16:01 PM: के बारे में, धागा 6
- 2012/09/12 12:16:31: संपर्क, धागा 7
- 9/12/2012 12:16:33 PM: के बारे में, धागा 14
- ...
- 9/12/2012 12:17:08: संपर्क, धागा 12
- 9/12/2012 12:17:09 PM: के बारे में, धागा 12
- 9/12/2012 12:17:28 PM: के बारे में , धागा 5
- ...
फ़िडलर से:
तो ... ले घर संदेश इसमें हैं :
- HTTP ट्रैफ़िक सामान्य लगता है (फ़िडलर किसी भी डुप्लिकेट अनुरोध नहीं दिखा रहा है)
- कार्रवाई तरीकों दो बार या तीन बार एक ही अनुरोध के लिए कभी कभी कहा जा रहा है, मालूम होता है गैर निर्धारणात्मक (यानी ऊपर वर्णित मूल समस्या)
- दिलचस्प बात यह है कि, मेरी स्थिति में, ऐसा लगता है कि बिल्कुल 1 9 कार्यवाही पर एक और 'हिट' होता है (यानी जब कार्रवाई विधियों को कई बार मारा जा रहा है, तो बीच का अंतर हिट नियतात्मक है)
- धागा आईडी आम तौर पर प्रत्येक हिट के लिए अलग हैं जब भी कार्रवाई के तरीकों को कई बार
मैं गहराई रखेंगे मारा जाता है ... शायद किसी तरह पर्याप्त एक सुझाव की पेशकश करने के होगा हालांकि इस अद्यतन जानकारी के आधार पर :)।
संपादित 2 मैं प्रत्येक मामले में कार्रवाई विधि के अंदर धागा आईडी के साथ बाहर प्रक्रिया ID मुद्रित करने के लिए फैसला किया। प्रत्येक अनुरोध के लिए, प्रक्रिया आईडी आईआईएस एक्सप्रेस वर्कर प्रक्रिया से संबंधित थी। तो ऐसा लगता है कि आईआईएस एक्सप्रेस वर्कर प्रक्रिया कभी-कभी अनुरोध को संभालने के लिए कई धागे उत्पन्न करती है, प्रत्येक 1 9 के अलावा।
... और मुझे जाना गहरी ... :)
संपादित 3
मुझे लगता है कि मैं इस समस्या के करीब हो रही है ... मैं आईआईएस एक्सप्रेस ट्रे पर एक नज़र था और बाद मैं आवेदन (डिबगिंग के बिना) शुरू की थी निम्नलिखित देखा:
मैं (जैसा कि ऊपर फ़िडलर में दिखाया गया 127.0.0.2:8888 के बजाय) सीधे इस URL का उपयोग करने का फैसला किया है, और समस्या से दूर जाने के लिए उत्सुक। अब यह समझ में आ रहा है ... अगर मैं आईआईएस आवेदन सीधे बंदरगाह 8889 पर आमंत्रित करता हूं, तो सब कुछ ठीक काम करता है जैसा कि मूल गैर-एज़ूर परियोजना के साथ किया गया था। अगर मैं बंदरगाह 8888 पर वेब भूमिका (यानी Azure- विशिष्ट भाग) का आह्वान करता हूं, तो कभी-कभी आईआईएस एप्लिकेशन को कई बार आमंत्रित करना प्रतीत होता है।
तो मैं अब वेब भूमिका पर अपना ध्यान केंद्रित करना शुरू कर रहा हूं। मुझे लगता है मैं कुछ प्रासंगिक वेब भूमिका लॉग पाते हैं या नहीं की कोशिश करता हूँ ...
संपादित 4
मुझे यकीन है कि diagnostics was set up properly आवेदन पर किए गए और डिबग मोड में यह भाग गया। मैं फिर एज़ूर कंप्यूट एमुलेटर यूआई में गया, मेरे वेब-रोल इंस्टेंस पर राइट-क्लिक किया, और "ओपन लोकल स्टोर" चुना। यह मुझे एक्सप्लोरर में ले गया, जहां मैं एक बच्चे फ़ोल्डर "temp \ temp \ RoleTemp \ iisexpress" ढूंढने में सक्षम था, जिसमें इस तरह की सामग्री के साथ एक लॉग फ़ाइल थी (ध्यान दें कि मैंने अपना एंडपॉइंट वापस पोर्ट 80 में बदल दिया है , तो आईआईएस एक्सप्रेस आवेदन अब बंदरगाह 81) पर वापस आ गया है:
- अनुरोध शुरू कर दिया: "GET" 127.0.0.1:81/Home/About
- अनुरोध समाप्त हो गया: 127.0.0.1:81/Home/About HTTP स्थिति के साथ 200.0
- अनुरोध शुरू कर दिया: "GET" 127.0.0.1:81/Home/Contact
- अनुरोध समाप्त हो गया: 127.0.0.1:81/Home/Contact HTTP स्थिति के साथ 200,0
- अनुरोध शुरू कर दिया: "GET" 127.0.0.1:81/Home/Contact
- अनुरोध समाप्त हो गया: 127.0.0.1:81/Home/Contact HTTP स्थिति के साथ 200,0
- अनुरोध शुरू कर दिया: "GET" 127.0.0.1:81/Home/Contact
- अनुरोध समाप्त हो गया: 127.0.0.1:81/Home/Contact HTTP स्थिति के साथ 200,0
- अनुरोध शुरू कर दिया: "GET" 127.0.0 .1: 81/होम/लगभग
- अनुरोध समाप्त हुआ: 127.0.0.1:81/Home/ HTTP स्थिति 200 के साथ।0
- अनुरोध शुरू कर दिया: "GET" 127.0.0.1:81/Home/About
- अनुरोध समाप्त हो गया: 127.0.0.1:81/Home/About HTTP स्थिति 200,0
- अनुरोध शुरू कर दिया साथ: "GET" 127.0.0.1:81/Home/About
- अनुरोध समाप्त हो गया: 127.0.0.1:81/Home/About HTTP स्थिति के साथ 200,0
- अनुरोध शुरू कर दिया: "GET" 127.0.0.1:81/ घर/संपर्क
- अनुरोध समाप्त हो गया: 127.0.0.1:81/Home/Contact HTTP स्थिति के साथ 200,0
- अनुरोध शुरू कर दिया: "GET" 127.0.0.1:81/Home/Contact
- अनुरोध समाप्त हो गया: 127.0 .0.1: 81/होम/HTTP स्थिति के साथ संपर्क 200,0
- अनुरोध शुरू कर दिया: "GET" 127.0.0.1:81/Home/Contact
- अनुरोध समाप्त हो गया: साथ 127.0.0.1:81/Home/Contact HTTP स्थिति 200.0
- अनुरोध शुरू कर दिया: "GET" 127.0.0.1:81/Home/About
- अनुरोध समाप्त हो गया: "GET" 127.0.0.1: 127.0.0.1:81/Home/About HTTP स्थिति के साथ 200.0
- अनुरोध शुरू कर दिया : 81/होम/संपर्क
- अनुरोध समाप्त हो गया: HTTP स्थिति 200,0
फिर मैं तो बस के बारे में और संपर्क पृष्ठों के बीच टॉगल किया गया था के साथ 127.0.0.1:81/Home/Contact, इसलिए से लॉग एक देख सकते हैं कि एक वेब-रोल एंडपॉइंट अनुरोध कभी-कभी वेब भूमिका में आईआईएस एप्लिकेशन को कई बार बुलाता है। अब कुछ उच्च स्तरीय वेब-रोल लॉग की खोज करने के लिए यह पता लगाने के लिए कि यह क्यों कर रहा है :)!
आपकी समस्या के बारे में निश्चित नहीं है लेकिन मैं आपको बता सकता हूं कि रीमेपिंग काफी सामान्य है - मेरा एज़ूर एमुलेटर हर बार ऐसा करता है और मुझे एमवीसी 4 के साथ कोई समस्या नहीं है। – JcFx