2009-11-10 17 views
15

मुझे अपने साझा होस्ट पर तैनात एएसपी.नेट एमवीसी ऐप पर कस्टम त्रुटियों के साथ कोई समस्या है। मैंने एक त्रुटि नियंत्रक बनाया है और अनचाहे अपवादों को पकड़ने के लिए Global.asax पर निम्न कोड जोड़ा है, उन्हें लॉग इन करें, और फिर कस्टम त्रुटियों को प्रदर्शित करने के लिए त्रुटि नियंत्रक को नियंत्रण स्थानांतरित करें। इस कोड को here से लिया जाता है:एएसपी.नेट एमवीसी ऐप कस्टम त्रुटि पेज साझा होस्टिंग पर्यावरण में प्रदर्शित नहीं हो रहे हैं

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError(); 
    Response.Clear(); 

    HttpException httpEx = ex as HttpException; 
    RouteData routeData = new RouteData(); 
    routeData.Values.Add("controller", "Error"); 

    if (httpEx == null) 
    { 
     routeData.Values.Add("action", "Index"); 
    } 
    else 
    { 
     switch (httpEx.GetHttpCode()) 
     { 
      case 404: 
       routeData.Values.Add("action", "HttpError404"); 
       break; 
      case 500: 
       routeData.Values.Add("action", "HttpError500"); 
       break; 
      case 503: 
       routeData.Values.Add("action", "HttpError503"); 
       break; 
      default: 
       routeData.Values.Add("action", "Index"); 
       break; 
     } 
    } 

    ExceptionLogger.LogException(ex); // <- This is working. Errors get logged 

    routeData.Values.Add("error", ex); 
    Server.ClearError(); 
    IController controller = new ErrorController(); 
    // The next line doesn't seem to be working 
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 
} 

Application_Error निश्चित रूप से फायरिंग कर रहा है क्योंकि प्रवेश ठीक काम करता है, लेकिन इसके बजाय अपने कस्टम त्रुटि पृष्ठों को प्रदर्शित करने में, मैं गो डैडी सामान्य लोगों को मिलता है। ब्लॉग पोस्ट के शीर्षक से उपरोक्त कोड लिया गया है, मुझे लगता है कि यह एमवीसी ढांचे के रिलीज उम्मीदवार 2 का उपयोग करता है। क्या 1.0 में कुछ बदलाव आया जो कोड की आखिरी पंक्ति काम नहीं करता है? सामान्य रूप से यह works great on my machine है।

किसी भी सुझाव की सराहना की जाएगी।

संपादित करें: यह उल्लेख करना भूल गया कि मैंने Web.config (ऑफ, ऑन, और रिमोटऑनली) में customErrors मोड के लिए सभी 3 possiblities की कोशिश की है। इस सेटिंग के बावजूद वही परिणाम।

संपादित 2: और मैंने नियंत्रक कक्षाओं पर [हैंडलरर] सजावट के साथ और उसके बिना भी कोशिश की है।

अपडेट: मैंने पता लगाया है और 404s तय कर दिया है। गो डैडी के होस्टिंग कंट्रोल सेंटर में सेटिंग्स पैनल का एक अनुभाग है जहां 404 व्यवहार नियंत्रित किया जा सकता है और डिफ़ॉल्ट उनके सामान्य पृष्ठ को दिखाना है, और स्पष्ट रूप से यह किसी भी Web.config सेटिंग्स को ओवरराइड करता है। तो मेरा कस्टम 404 पेज अब इरादे के रूप में दिखा रहा है। हालांकि, 500 और 503 अभी भी काम नहीं कर रहे हैं।

public static HomeContent GetStaticContent() 
{ 
    HomeContent hc; 

    try 
    { 
     string path = Configuration.CcmConfigSection.Config.Content.PathToStaticContent; 
     string fileText = File.ReadAllText(path); 
     string regex = @"^[^#]([^\r\n]*)"; 
     MatchCollection matches = Regex.Matches(fileText, regex, RegexOptions.Multiline); 
     hc = new HomeContent 
      { 
       ID = Convert.ToInt32(matches[0].Value), 
       Title = matches[1].Value, 
       DateAdded = DateTime.Parse(matches[2].Value), 
       Body = matches[3].Value, 
       IsCurrent = true 
      }; 
    } 
    catch (Exception ex) 
    { 
     try 
     { 
      ExceptionLogger.LogException(ex); 
     } 
     catch 
     { 
      // couldn't log exception, continue without crashing 
     } 
     hc = null; 
    } 

    return hc; 
} 
:

public ActionResult Index() 
{ 
    CcmDataClassesDataContext dc = new CcmDataClassesDataContext(); 

    // This might generate an exception which will be handled in the OnException override 
    HomeContent hc = dc.HomeContents.GetCurrentContent(); 

    ViewData["bodyId"] = "home"; 
    return View(hc); 
} 

protected override void OnException(ExceptionContext filterContext) 
{ 
    // Only concerned here with SqlExceptions so an HTTP 503 message can 
    // be displayed in the Home View. All others will bubble up to the 
    // Global.asax.cs and be handled/logged there. 
    System.Data.SqlClient.SqlException sqlEx = 
     filterContext.Exception as System.Data.SqlClient.SqlException; 
    if (sqlEx != null) 
    { 
     try 
     { 
      ExceptionLogger.LogException(sqlEx); 
     } 
     catch 
     { 
      // couldn't log exception, continue without crashing 
     } 

     ViewData["bodyId"] = "home"; 
     filterContext.ExceptionHandled = true; 
     HomeContent hc = ContentHelper.GetStaticContent(); 
     if (hc == null) 
     { 
      // Couldn't get static content. Display friendly message on Home View. 
      Response.StatusCode = 503; 
      this.View("ContentError").ExecuteResult(this.ControllerContext); 
     } 
     else 
     { 
      // Pass the static content to the regular Home View 
      this.View("Index", hc).ExecuteResult(this.ControllerContext); 
     } 
    } 
} 

यहाँ कोड है कि स्थिर सामग्री लाने के लिए प्रयास करता है: मैं इस प्रकार की सामग्री के एक स्थिर पाठ संस्करण हड़पने के लिए करता है, तो Sql सर्वर एक अपवाद फेंकता HomeController में कोड मिल गया है

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

क्या किसी के पास कोड में सुधार के बारे में कोई सुझाव है जो मदद कर सकता है? क्या यह विभिन्न शीर्षलेखों को HttpResponse में जोड़ने में मदद करेगा? या गो डैडी 503 के दशक को भारी हद तक अपहरण कर रहा है?

उत्तर

29

मुझे समाधान मिला है और यह अविश्वसनीय रूप से सरल है। वास्तव में समस्या आईआईएस 7 में बदल गई थी।

public bool TrySkipIisCustomErrors { get; set; } 

इस के साथ ही मेरी निकटतम खोज इंजन है जो एक great blog post by Rick Strahl और एक अन्य कर दिया angrypets.com पर करने के लिए मेरे नेतृत्व: दृश्य स्टूडियो में इस मुद्दे डिबगिंग जबकि मैं HttpResponse वस्तु की एक संपत्ति है कि मैंने पहले देखा नहीं था देखा था this question here on SO। ये लिंक की तुलना में मैं कर सकते हैं ज्यादा बेहतर रक्तमय विवरण की व्याख्या है, लेकिन रिक की पोस्ट से इस उद्धरण यह बहुत अच्छी तरह से कब्जा:

क्योंकि त्रुटि ASP.NET द्वारा फंस जाता है असली भ्रम यहाँ होता है, लेकिन फिर अंत में अभी भी संभाला आईआईएस द्वारा 500 स्थिति कोड देखता है और स्टॉक आईआईएस त्रुटि पृष्ठ देता है।

ऐसा लगता है कि यह व्यवहार एकीकृत मोड में आईआईएस 7 के लिए विशिष्ट है। msdn से:

जब IIS 7.0 में क्लासिक मोड में चल रहा TrySkipIisCustomErrors संपत्ति डिफ़ॉल्ट मान सच है। एकीकृत मोड में चलते समय, TrySkipIisCustomErrors प्रॉपर्टी डिफ़ॉल्ट मान गलत है।

तो अनिवार्य रूप से सभी मैं क्या करने वाले को समाप्त Response.TrySkipIisCustomErrors = true; जोड़ने सही किसी भी कोड है कि 500 ​​या 503 के लिए Response.StatusCode और अब सब कुछ सेट कार्यों के लिए बनाया गया के रूप में के बाद है।

+1

+1 धन्यवाद, ब्रायन। खोज के 2+ घंटों के बाद आपने मुझे जवाब दिया जो मुझे चाहिए। यह बहुत आसान हैं। मैं एक 404 त्रुटि कोड सेट करने की कोशिश कर रहा था जो मुझे एक सुरक्षा अपवाद दे रहा था और "Response.TrySkipIisCustomErrors = true;" ठीक कर दिया। –

+2

यह मुझे पागल बनाने के लिए चला रहा था। बहुत बहुत धन्यवाद। "Response.TrySkipIisCustomErrors = true;" मेरे त्रुटि नियंत्रक में प्रतिक्रिया कोड सेट करने के तुरंत बाद मेरे लिए क्या काम किया गया है। यह भ्रामक था क्योंकि मेरा स्थानीय आईआईएस 7 उदाहरण मेरे कस्टम त्रुटि दृश्यों को प्रस्तुत कर रहा था, लेकिन रिमोट स्टेजिंग सर्वर नहीं था। = पी – NovaJoe

+0

मैं इस उत्तर में जो प्रदान किया गया है उसे लागू करने के बाद मैं उसी नाव में था: http://stackoverflow.com/a/7499406/114029। 'Response.TrySkipIisCustomErrors = सत्य;' स्वर्ग से आता है! :) –

0

मैं गोडाडी पर एक एएसपी.नेट एमवीसी साइट होस्ट करता हूं और कस्टम त्रुटि पृष्ठों से निपटने के मुद्दों का भी सामना करता हूं। परीक्षण और त्रुटि के माध्यम से मैंने जो पाया, वह था कि गोडाडी HTTP स्तर पर त्रुटियों को रोकता है।

उदाहरण के लिए, 404 के HTTP स्टेटस कोड को लौटाए गए किसी भी पृष्ठ ने गोडाडी के कस्टम त्रुटि पृष्ठ को संभालने का कारण बना दिया। आखिर में मैंने 200 कस्टम स्थिति वापस करने के लिए अपने कस्टम त्रुटि पृष्ठों को बदल दिया और 404 से संबंधित समस्या चली गई। मेरा एचटीएमएल वही था, बस बदलने के लिए आवश्यक HTTP स्थिति।

मैंने स्वीकार्य रूप से 503 स्थिति प्रतिक्रियाओं के साथ ऐसा करने की कोशिश नहीं की, लेकिन यह संभव है कि एक ही शमन कार्य कर सके। यदि आप 200 स्थिति लौटने के लिए 503 स्थिति लौटने से बदलते हैं, तो क्या समस्या दूर हो जाती है?

ध्यान दें कि, यदि आप यह कामकाज करते हैं, तो आप खोज इंजन को अपने त्रुटि पृष्ठों को अनुक्रमणित करने से रोकना चाहते हैं, जो एक बार फिर 200 डिग्री लौटाएंगे (नियमित इंजन के परिप्रेक्ष्य से) नियमित पृष्ठ से अलग-अलग होंगे। इसलिए अपने त्रुटि पृष्ठों के अनुक्रमण को रोकने के लिए मेटा रोबोट टैग जोड़ना सुनिश्चित करें, उदा।

<META NAME="ROBOTS" CONTENT="NOINDEX"> 

इस दृष्टिकोण का नकारात्मक पक्ष यह हो सकता है कि आपका पृष्ठ Google से हटाया जा सके, जो निश्चित रूप से अच्छी बात नहीं है!

अद्यतन: तो, इसके अलावा, आप भी पता लगा सकते हैं उपयोगकर्ता एजेंट एक क्रॉलर है या नहीं, और अगर यह एक क्रॉलर एक 503 वापसी अगर यह एक क्रॉलर नहीं है, एक 200 देखें this blog post वापसी करते हुए जानकारी के लिए क्रॉलर का पता लगाने के बारे में कैसे। हां, मुझे पता है कि क्रॉलर बनाम उपयोगकर्ताओं को अलग-अलग सामग्री लौटाना एक एसईओ नो-नो है, लेकिन मैंने इसे कई साइटों पर किया है, अब तक कोई बुरा प्रभाव नहीं है, इसलिए मुझे यकीन नहीं है कि कितनी समस्या है।

किसी भी oddball क्रॉलर बॉट डिटेक्टर के माध्यम से पर्ची के मामले में दोनों दृष्टिकोण (मेटा रोबोट्स और बॉट डिटेक्शन) करना आपकी सबसे अच्छी शर्त हो सकती है।

+0

धन्यवाद जस्टिन। अंततः मुझे पता चला कि 404 को कैसे ठीक किया जाए, ऊपर मेरा अपडेट देखें। मेरी स्थिति में इस दृष्टिकोण के साथ समस्या यह है कि 503 में से कुछ वास्तविक पृष्ठ पर दोस्ताना संदेश प्रदर्शित करना चाहते हैं जहां सामग्री होगी। अगर मैं 503 के बजाय 200 लौटाता हूं और उस दिन किसी भी क्रॉलर को अनुक्रमणित करने के लिए पर्याप्त दुर्भाग्यपूर्ण हूं, तो वे सही सामग्री के बजाय मेरे अनुकूल त्रुटि संदेश को इंडेक्स करेंगे। तो यह मेरे विशेष मामले में काम नहीं करेगा। हालांकि उत्तर के लिए धन्यवाद। – Bryan

+0

हाँ, क्रॉलर के लिए देखना होगा। मैंने अपनी मूल पोस्ट में नोट किया कि आप इसके चारों ओर जाने के लिए रॉबोट्स मेटा टैग का उपयोग कर सकते हैं, लेकिन मैंने अभी भी और विवरण जोड़े हैं। ऊपर देखो। –

+0

आपने किसी भी बीमार प्रभाव को नहीं देखा होगा, लेकिन यह जानने का कोई तरीका नहीं है कि यह मेरे और मेरे क्लाइंट के लिए भी सही होगा :-)।मैं आपके दृष्टिकोण पर विचार करने में संकोच कर रहा हूं क्योंकि इसके परिणामस्वरूप मेरा ग्राहक हो सकता है, और विस्तार से मुझे हटाया जा सकता है और/या खोज इंजन इंडेक्स से प्रतिबंधित किया जा सकता है। – Bryan

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