2016-10-20 6 views
7

मैं वर्तमान में 500 के यहाँ से निपटने के लिए httpErrors सेटअप मिल गया है: -customErrors बनाम कस्टम मॉड्यूल

<httpErrors errorMode="Custom" existingResponse="Replace"> 
     ...... 
     <remove statusCode="500"/> 
     <error statusCode="500" path="/server-error" responseMode="ExecuteURL"/> 
</httpErrors> 

यह ठीक काम करता है, लेकिन इस मामले में जहां आईआईएस त्रुटि मैं अभी भी मौत का पीला स्क्रीन प्राप्त प्राप्त करता है। एक उदाहरण यह है कि जब इकाई ढांचा डेटाबेस से कनेक्ट नहीं हो सकता है और मुझे प्राप्त होता है: -

लॉगिन द्वारा अनुरोधित डेटाबेस "टेस्ट-डीबी" नहीं खोल सकता है।
लॉगिन विफल रहा।
उपयोगकर्ता 'sa' के लिए लॉगिन विफल रहा।

मैं सेटअप customErrors है इस से निपटने के लिए: -

<customErrors mode="On" defaultRedirect="error.html" redirectMode="ResponseRedirect"> 
     <error statusCode="500" redirect="error.html" /> 
</customErrors> 

जो के रूप में रूप में लंबे समय के रूप में वहाँ preCondition="managedHandler" के बिना कोई modules उम्मीद काम करता है।

मेरे पास कुछ मॉड्यूल हैं जो छवियों और सीएसएस फ़ाइलों से निपटते हैं और एक ही प्रोजेक्ट में हैं।

<modules runAllManagedModulesForAllRequests="false"> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" /> 
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" /> 
     <add name="ImageHandler" type="foo.bar.ProductImageHandlerHttpModule" /> 
     <add name="CustomCssHandler" type="foo.bar.CustomCssHttpModule" /> 
     <add name="Glimpse" type="Glimpse.AspNet.HttpModule, Glimpse.AspNet" preCondition="integratedMode" /> 
</modules> 

टिप्पणी इन बाहर और मैं error.html मिलता है, उन में रखने के लिए और मैं

रनटाइम त्रुटि मिल
विवरण: अपने अनुरोध संसाधित करते समय अपवाद हो गई। इसके अतिरिक्त, पहले अपवाद के लिए कस्टम त्रुटि पृष्ठ निष्पादित करते समय एक और अपवाद हुआ। अनुरोध समाप्त हो गया है।

दिखा रहा है कि इस परियोजना से एक मॉड्यूल भी जब error.html दिखाने की कोशिश erroring है

क्या किसी को भी एक फिक्स/वर्कअराउंड पता है?

+0

हाय @ बेनजी, मैंने इस मुद्दे को पुन: पेश करने की कोशिश की। मुझे लगता है कि समस्या preCondition = "प्रबंधित हैडलर" के साथ है, भले ही https://msdn.microsoft.com/en-us/library/ms690693(v=vs.90).aspx के लिए प्रलेखन कहता है कि इसे मॉड्यूल नहीं चलाया जाना चाहिए जिसमें पूर्व शर्त = गैर प्रबंधित ऐसे एचटीएमएल के लिए "प्रबंधित हैंडलर" यह अभी भी करता है। मैं सिर्फ यह पता लगाने की कोशिश कर रहा हूं कि क्यों आईआईएस अभी भी एचटीएमएल फाइल के लिए मॉड्यूल चलाता है जिसमें पूर्व शर्त है। –

+0

@MurtazaTahirAli मॉड्यूल ** ** के साथ पूर्व शर्त मेरे लिए नहीं चलती है। यह अन्य _foo.bar._ कस्टम वाले हैं जो अगली त्रुटि फेंक देते हैं। – BenG

उत्तर

1

यह एक कठिन स्थिति है - आपकी त्रुटि HttpModule से आता है, जो प्रत्येक अनुरोध के लिए चलाया जाता है - जिसमें error.html पृष्ठ का अनुरोध शामिल है। एक तरीका है कि आप अपने सर्वर के माध्यम से स्थैतिक फ़ाइलों (जैसे error.html) को रूट करें - और उन्हें .NET स्तर पर अनदेखा करें; यह हमेशा संभव नहीं हो सकता है (कभी-कभी .NET स्तर पर स्थिर फ़ाइलों को संभालना आसान है)। केवल अन्य तरह से मैं बंद बारे में सोच सकते Global.asax में हुक है घटना त्रुटि और यह अपने आप को संभाल

कुछ की तरह (जो customErrors ध्यान नहीं देगा) करने के लिए:

public class Global : System.Web.HttpApplication 
{ 
    protected void Application_Error(object sender, EventArgs e) 
    { 
     // is there an error ? 
     var error = Server.GetLastError(); 
     if (error != null) 
     { 
      // mark the error as - "i'll handle it myself" 
      Server.ClearError(); 
      // load error.html manually & dump it to response 
      var content = File.ReadAllText(Server.MapPath("~/error.html")); 
      Context.Response.Write(content); 
      // set correct error code 
      Context.Response.StatusCode = 500; 
     } 
    } 
} 

नोट: इस बाहर इस्त्री किया जा सकता है, लेकिन आप सामान्य सिद्धांत देखें ...

+0

इसने 100% समस्या को ठीक नहीं किया है, क्योंकि _response_ अनुपलब्ध है यदि आपको साइट स्टार्टअप पर कोई त्रुटि मिलती है, लेकिन 'Application_Error' सबसे संगत उत्तर लगता है और यह सबसे पहले मैं आपको बक्षीस दूंगा। धन्यवाद। – BenG

0

रूप @Ondrej ने कहा, एक और त्रुटि HttpModule पर बिना क्रिया का अपवाद से आता है कस्टम त्रुटि पेज से निपटने हुआ है, इस प्रकार यह आवश्यक है या तो छोड़ सकते हैं या web.config फ़ाइल पर customErrors अनुभाग को दरकिनार करते हुए।

इस कोड को भी शामिल किया गया है कि कैसे आईआईएस से बने हुए कस्टम त्रुटियों को छोड़ने के लिए, कस्टम HTML त्रुटि पृष्ठ पैदा करने के अलावा: इसके अतिरिक्त

protected void Application_Error(Object sender, EventArgs e) 
{ 
    // Get last error occurred 
    var exception = Server.GetLastError(); 

    // catch unhandled exceptions 
    if (exception is HttpUnhandledException) 
    { 
     // handle the error by ASP .NET itself 
     Server.ClearError(); 

     // write status code handling 
     HttpContext.Current.Response.WriteFile(Server.MapPath("~/error.html")); 
     HttpContext.Current.Response.StatusCode = 500; 
     HttpContext.Current.Response.StatusDescription = "Internal Server Error"; 

     // set ASP .NET handlers instead of using IIS handlers 
     HttpContext.Current.Response.TrySkipIisCustomErrors = true; 
    } 
} 

, आप निर्धारित कर सकते हैं आईआईएस द्वारा उत्पन्न YSOD पृष्ठों existingResponse त्रुटि पारित करने के लिए विशेषता से छुटकारा पाने के इस रूप में एएसपी नेट Application_Error विधि में से निपटने:

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="PassThrough"> 
    <remove statusCode="500" /> 
    <error statusCode="500" responseMode="File" path="/error.html" /> 
    </httpErrors> 
</system.webServer> 

कंवलजीत सिंगला के विवरण से आधारित उन सेटिंग्स के पीछे कारण (source here):

0,123,

existingResponse इस खंड स्तर संपत्ति के

मूल्य कस्टम त्रुटि मॉड्यूल जब प्रतिक्रिया पाठ खाली नहीं है क्या करने के लिए क्या कहता है। यदि कोई मॉड्यूल IHttpResponse :: SetStatus को त्रुटि कोड सेट करने के लिए सेट करता है और प्रतिक्रिया टेक्स्ट भी सेट करता है, तो मौजूदा रीस्पॉन्स प्रॉपर्टी बताती है कि कस्टम त्रुटि मॉड्यूल को वर्तमान प्रतिक्रिया टेक्स्ट को अपने स्वयं के त्रुटि टेक्स्ट से प्रतिस्थापित करना चाहिए या होना चाहिए, यह वर्तमान प्रतिक्रिया टेक्स्ट पास के माध्यम से। Asp.Net और WCF मॉड्यूल का उदाहरण हैं जो त्रुटि प्रतिक्रिया पाठ सेट करता है। यह गुण को तीन मानों का पालन करने के लिए सेट किया जा सकता है।

  • बदलें - यह मान कस्टम त्रुटि मॉड्यूल द्वारा उत्पन्न पाठ के साथ हमेशा त्रुटि जानकारी को प्रतिस्थापित करने के लिए कस्टम त्रुटि मॉड्यूल बनाता है। यदि मौजूदा रेस्पॉन्स "प्रतिस्थापन" पर सेट है, द्वारा उत्पन्न त्रुटियों/अपवाद Asp.Net/WCF को IIS7 त्रुटियों द्वारा प्रतिस्थापित किया गया है।

  • पासथ्रू - यदि मौजूदा रेस्पॉन्स को "पासथ्रू" के रूप में देखा जाता है, तो कस्टम त्रुटि मॉड्यूल हमेशा मॉड्यूल से प्रतिक्रियाओं के माध्यम से गुजरता है। यह सेटिंग मॉड्यूल कोई टेक्स्ट सेट नहीं करते हैं तो यह सेटिंग कस्टम त्रुटि मॉड्यूल रिक्त प्रतिक्रिया वापस कर देगी।

  • ऑटो - यह डिफ़ॉल्ट मान है और सही चीज़ करने के लिए कस्टम त्रुटि मॉड्यूल बताता है। ग्राहकों द्वारा देखा गया वास्तविक त्रुटि पाठ IHttpResponse :: GetStatus कॉल में लौटाए गए FTrySkipCustomErrors के मान के आधार पर प्रभावित होगा। जब TrySkipCustomErrors को पर सेट किया गया है, तो कस्टम त्रुटि मॉड्यूल प्रतिक्रिया को पार करने देगा, लेकिन यदि यह गलत पर सेट है, तो कस्टम त्रुटियां मॉड्यूल टेक्स्ट को अपने टेक्स्ट से बदल देता है। Asp.Net/WCF कॉल IHttpResponse :: TrySkipCustomErrors सत्य के साथ सेटस्टैटस ताकि आईआईएस अपनी त्रुटियों को अपने आप से ओवरराइड न करे। जब प्रभावी त्रुटि मोड "विस्तृत" है और प्रतिक्रिया खाली नहीं है, तो मौजूदा रेस्पॉन्स का मान TrySkipCustomErrors के मान के बावजूद "पासथ्रू" के रूप में कार्य करेगा।

उम्मीद है कि इस जब बिना क्रिया का अपवाद प्रतिक्रिया के लिए कस्टम त्रुटि पेज की स्थापना आवश्यक चीजें पता चल सकता है।

MSDN संदर्भ:

https://msdn.microsoft.com/en-us/library/ms690576(v=vs.90).aspx

https://msdn.microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors(v=vs.110).aspx

अतः संदर्भ:

IIS7 Overrides customErrors when setting Response.StatusCode?

How to send status code "500" for generic error page in IIS?

Getting IIS7 'one liner' error when using custom error settings in web.config

+0

बस कोशिश की, दुर्भाग्य से मुझे त्रुटि मिलती है _Response इस संदर्भ में उपलब्ध नहीं है। _ Response.WriteFile (Server.MapPath ("~/error.html")); ' – BenG

+0

मुझे एहसास हुआ कि' प्रतिक्रिया ' Application_Error' विधि 'HttpContext.Current.Response' की बजाय' HttpAplication 'वर्ग से आता है, वर्तमान संदर्भ' Response.WriteFile 'को सक्रिय करने के लिए आवश्यक हो सकता है। –

0

ऐसा लगता है कि यदि आपका आईआईएस एकीकृत मोड के साथ सेट है तो मॉड्यूल स्थिर फ़ाइलों के लिए अभी भी चलाए जाएंगे। यदि आप इसे क्लासिक मोड में सेट करते हैं तो यह स्थिर फ़ाइलों के लिए प्रबंधित मॉड्यूल को अनदेखा कर देगा।

कृपया Requests for static files are hitting the managed code in ASP.NET MVC3

अधिक infomration के लिए इस सूत्र का उल्लेख जोआओ का जवाब देखने के एंजेलो ठीक या तो है आप करने के लिए अपने हैंडलर बदल अपवाद फेंक नहीं है या आप क्लासिक मोड के लिए आईआईएस बदलें ताकि यदि कोई हैंडलर या अन्य भाग अपवाद फेंकता और iis error.html पर रीडायरेक्ट करता है तो प्रबंधन मॉड्यूल में से कोई भी हिट नहीं होना चाहिए।

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