2011-09-17 18 views
6

में अजाक्स अनुरोधों में त्रुटि प्रबंधन से संबंधित संदेह मैं विजुअल स्टूडियो 2010 का उपयोग करके कुछ दिनों के लिए अपनी स्थानीय मशीन पर एक वेब एप्लिकेशन विकसित कर रहा हूं। कल रात मैंने आईआईएस 7 पर अपना आवेदन तैनात किया और निराशाजनक रूप से ठोकर खाई प्रमुख शो स्टॉपर। समस्या अजाक्स अनुरोध में त्रुटि प्रबंधन से संबंधित है। शुरू करने के लिए मेरे पास कुछ संपादन स्क्रीन हैं जो AJAX अनुरोध पर काम करती हैं। यहां अजाक्स संपादन स्क्रीन का AJAX हिस्सा कैसा दिखता है।एएसपीनेट एमवीसी

@using (Ajax.BeginForm("_CityEdit", null, new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "content", 
                  LoadingElementId="imgSaveLoading", OnFailure="onError", 
                  OnSuccess = "onSuccess" }, new { id = "frmCity" })) { 
    <img id="imgSaveLoading" alt="loading" src="@Url.Content("~/Content/Telerik/Vista/loading.gif")" class="ajax-loader-user" /> 
    <div class="content" id="content"> 
     @{Html.RenderPartial("_CityEdit");} 
    </div> 

    <!-- Some Other code here --> 
} 

मैं ऊपर Ajax.BeginForm की "onError" कॉलबैक पर भरोसा किया गया था()। तो मेरे नियंत्रक में, जब भी मैं उपयोगकर्ता (मॉडल त्रुटि या किसी अन्य त्रुटि) में त्रुटि प्रदर्शित करना चाहता था, तो मैंने बस 500 प्रतिक्रिया (आंतरिक सर्वर त्रुटि) को सर्वर प्रतिक्रिया सेट की उम्मीद की उम्मीद है कि इसका परिणाम अजाक्स के "ऑनरर" हैंडलर होगा। बेगिनफॉर्म() बुलाया जा रहा है। यहां एक स्निपेट है कि मैंने इसे अपने नियंत्रक में कैसे किया।

[HttpPost] 
public ActionResult _CityEdit(CityViewModel viewModel) { 
    city = cityManager.FindCity(viewModel.City.Id, false); 
    // Validate Model here 
    if (!TryUpdateModel(city, "City")) { 
     Response.StatusCode = 500; 
     return PartialView("_CityEdit", viewModel); 
    } 

के रूप में कोड के ऊपर से देखा जा सकता है, मैं PartialView लौट आए और अगर यह मॉडल त्रुटियाँ निहित, वे स्वतः स्क्रीन अजाक्स संपादित करें पर प्रदर्शित हो जाएगी। फिर "ऑनरर" जावास्क्रिप्ट में मैं केवल संबंधित div को नियंत्रक द्वारा वापस आंशिक दृश्य के साथ प्रतिस्थापित करता हूं।

function onError(xhr) { 
    $('#content').html(xhr.responseText); 
} 

यह सब मेरी विकास मशीन पर बहुत अच्छा काम किया। जब मैंने आईआईएस 7 पर अपना आवेदन तैनात किया और इसे पार्टिकल व्यू के बजाय विंडोज एक्सपी बॉक्स (आईई 8 या क्रोम के साथ) से एक्सेस किया, तो ब्राउजर ने सिर्फ "500 आंतरिक सर्वर त्रुटि" स्क्रीन को डिफ़ॉल्ट रूप से प्रदर्शित किया। तो मेरे पास कुछ संदेह हैं जो मुझे कल रात अच्छी तरह सो नहीं पाए।

  1. क्या दृष्टिकोण है जिसे मैंने अजाक्स के लिए एक उचित संपादन के लिए उपयोग किया है। यदि नहीं, तो दूसरा तरीका क्या हो सकता है, मैं अजाक्स संपादन (मॉडल त्रुटियों को प्रदर्शित करने की क्षमता के साथ) को संभाला सकता था।

  2. चूंकि मैं कुछ दिनों से इन मॉड्यूल को विकसित कर रहा हूं और काफी प्रयास कर चुका हूं, क्या यह XP बॉक्स पर काम करने के लिए कोई काम है। असल में, यह आदर्श होगा अगर मैं ब्राउज़र को अपनी डिफ़ॉल्ट "500 आंतरिक सर्वर त्रुटि" स्क्रीन प्रदर्शित करने से रोक सकता हूं।

  3. , इस दृष्टिकोण विंडोज 7 पर काम कर रहा है, क्योंकि मैं आईआईएस 7 ही खिड़कियों पर स्थापित 7 मशीन है कि मैं उपयोग कर रहा हूँ साइट को ब्राउज़ करने के लिए, या उसके सिर्फ इतना है कि यह खिड़कियों के साथ अच्छी तरह से काम 7.

यदि कोई अन्य सुझाव है, तो कृपया आगे बढ़ें।

संपादित करें: मुझे मेरी समस्या के लिए कामकाज मिला है। तो इसका मतलब है कि संदेह संख्या 2 और 3 का उत्तर दिया गया है। असल में web.config में निम्न प्रविष्टि ब्राउज़र को वेबसाइट के लिए डिफ़ॉल्ट ब्राउज़र पेज दिखाने से रोकती है।

<system.webServer> 
     <httpErrors errorMode="Detailed"/> 
    </system.webServer> 

लेकिन यह अभी भी मेरा पहला संदेह छोड़ देता है। क्या मैंने अजाक्स संपादन के लिए एक उचित दृष्टिकोण का उपयोग किया है?


मैं Fiddler साथ प्रतिक्रिया की जाँच की और यह आईआईएस कि सर्वर त्रुटि 500 ​​तो यह "विस्तृत" प्रतिक्रिया वापस करने के लिए कॉन्फ़िगर किए जाने की आवश्यकता के लिए डिफ़ॉल्ट त्रुटि पृष्ठ भेज रहा था था। हम आईआईएस प्रबंधक का उपयोग कर ऐसा कर सकते हैं। एक और विकल्प जिसका मैं अनुसरण कर रहा था उसे एप्लिकेशन की वेब.कॉन्फिग फ़ाइल में एप्लिकेशन स्तर पर परिभाषित करना है।

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

संबंध, निवन।

+0

अजीब है कि विस्तृत (या RemoteOnly और आप दूरदराज के हैं।) त्रुटि पृष्ठ आपकी समस्या का समाधान करेंगे। क्या आपका मतलब है कि सामग्री पृष्ठ की बजाय पूरे पृष्ठ को त्रुटि स्क्रीन द्वारा प्रतिस्थापित किया गया था? क्या यह ब्राउज़र में वर्तमान यूआरएल भी अपडेट करता है? ऐसा लगता है कि AJAX कॉल स्वयं विफल रहा है, क्योंकि इसे कभी भी सामान्य GET/POST में नहीं होना चाहिए - इसे केवल जेएस के माध्यम से प्रस्तुत करना चाहिए। मुझे लगता है कि आपकी तकनीक स्वीकार्य है क्योंकि आप AJAX कॉल से 500 के खिलाफ कभी भी रक्षा नहीं कर सकते * वैसे भी * - 'ऑनरर' उन्हें संभालने के लिए पर्याप्त होना चाहिए। मुझे लगता है कि आपको तैनात पर्यावरण में पहले काम नहीं कर रहे 'ऑनरर' का कारण खोदना चाहिए। – bzlm

+0

@bzlm, मुझे पूरा यकीन है कि ब्राउजर ने पूरे प्रतिक्रिया को उपेक्षित किया था जब मैंने 500 को प्रतिक्रिया स्थिति सेट करते समय दिए गए AJAX अनुरोध के लिए नियंत्रक से लौटाया था। किसी भी तरह, ब्राउज़र ने इसके बजाय अपनी "500 आंतरिक सर्वर त्रुटि" स्क्रीन प्रदर्शित की। लेकिन आप सही थे कि केवल सामग्री div की सामग्री को "500 आंतरिक सर्वर त्रुटि" पृष्ठ द्वारा प्रतिस्थापित किया गया था। मेरे एचटीएमएल पेज के अन्य भाग पहले के रूप में बने रहे। लेकिन फिर भी, मुझे ब्राउज़र को अपने त्रुटि पृष्ठ को पॉप करने से रोकना पड़ा और वास्तव में "त्रुटि मोड" ने इस मुद्दे को हल किया। मैंने अपने आवेदन में कुछ भी नहीं बदला (जहां तक ​​मुझे पता है)। धन्यवाद। – Jatin

+0

@bzlm, यहां वह जगह है जहां मुझे समाधान मिला। http://www.bala-krishna.com/how-to-disable-500- आंतरिक- सर्वर- आतंक-on-godaddy-windows- होस्टिंग/ – Jatin

उत्तर

0

नई आईआईएस 7 में: आप HttpResponse.TrySkipIisCustomErrors सच करने के लिए आईआईएस के त्रुटि पेज सेटिंग को ओवरराइड करने के लिए सेट करना होगा अपने web.config के customErrors पर की तैयारी में हैं, तो देखें this answer