2010-08-18 17 views
9

मैं ASP.NET के <customErrors> निर्देश का उपयोग कर एक सामान्य त्रुटि पृष्ठ का उपयोग कर रहा हूं।आईआईएस में सामान्य त्रुटि पृष्ठ के लिए स्थिति कोड "500" कैसे भेजें?

<customErrors mode="On" defaultRedirect="500.html" redirectMode="ResponseRewrite"> 
</customErrors> 

समस्या - जब कोई त्रुटि होती है, तो यह पृष्ठ HTTP स्थिति "500" वापस नहीं करता है। यह 200 के रूप में आता है। तो लिंक चेकर्स और मकड़ियों को यह नहीं पता कि कोई समस्या है।

मैं स्थिर 500.html पृष्ठ के साथ 500 HTTP स्थिति कैसे भेज सकता हूं?

आवश्यकताएँ:

  • मैं redirectMode = "ResponseRewrite" का उपयोग करना चाहिए
  • मैं एक गतिशील पेज, केवल स्थिर .html उपयोग नहीं कर सकते।

उत्तर

7

कस्टमइरर्स तत्व के लिए एमएसडीएन दस्तावेज बताता है कि इसे System.Web.Configuration.CustomErrorsSection द्वारा कार्यान्वित किया गया है। यदि हम उस कक्षा का विश्लेषण करने के लिए रेड गेट के .NET परावर्तक का उपयोग करते हैं, तो हम देख सकते हैं कि फ्रेमवर्क में यह सेटिंग कहां उपयोग की जाती है।

इसका उपयोग System.Web.UI.Page.HandleError और System.Web.HttpResponse.ReportRuntimeError द्वारा किया जाता है।

इनमें से दोनों अंत में कॉलिंग सिस्टम.Web.HttpResponse.RedirectToErrorPage।(इस विधि का नाम भ्रमित है: यह ध्यान रखना महत्वपूर्ण है कि RedirectToErrorPage रीडायरेक्ट मोड सेटिंग को पैरामीटर के रूप में लेता है, इसलिए यदि आप ResponseRewrite का उपयोग कर रहे हैं और वास्तव में कोई रीडायरेक्शन नहीं होता है तो भी कहा जाता है।)

का प्रासंगिक हिस्सा RedirectToErrorPage विधि है: दिन के अंत में यह सिर्फ एक सादे Server.Execute है:

if (redirectMode == CustomErrorsRedirectMode.ResponseRewrite) 
    { 
     this.Context.Server.Execute(url); 
    } 

वहाँ त्रुटि हैंडलिंग में प्रतिक्रिया कोड स्थापित करने के लिए किसी भी तरह से होना प्रतीत नहीं होता है। इसलिए यह अपरिहार्य लगता है कि आपको इच्छित HTTP प्रतिक्रिया प्राप्त करने के लिए कोड लिखना होगा।

क्या आप फिर से जांच सकते हैं कि आप एक सादा .html फ़ाइल का उपयोग क्यों करना चाहते हैं? यह त्रुटि प्रबंधन के लिए एक समझदार विकल्प प्रतीत होता है, क्योंकि आप किसी .aspx पृष्ठ के सभी ओवरहेड से गुजरना नहीं चाहते हैं, जिससे कोई और त्रुटि हो सकती है।

लेकिन शायद कुछ मध्यम जमीन है जो एक .html फ़ाइल के रूप में उतनी ही मजबूत होगी?

उदाहरण के लिए, आप एक precompiled HttpHandler बना सकते हैं, इसे URL /500.error पर पंजीकृत करें, और उसके बाद 500.error को अपना डिफ़ॉल्ट रेडियोधर्मी पृष्ठ बनाएं। (यह इसी तरह होगा जैसा ScriptResource.axd काम करता है।) यदि आप अपने मॉड्यूल को डीएलएल में प्रीकंपाइल करते हैं (जैसा कि एक सादे पुराने .axd फ़ाइल से ऑन-द-फ्लाई संकलन के विपरीत), तो आप पाएंगे कि यह उतना ही मजबूत है त्रुटि की स्थिति का चेहरा। अगर आपको कोई त्रुटि आती है जहां यह काम नहीं करेगा, तो एक स्थैतिक। एचटीएमएल फ़ाइल शायद काम नहीं करेगी - ध्यान रखें कि कस्टमइरर्स निर्देश अभी भी हुड के नीचे चल रहे .NET पर निर्भर करता है, और अभी भी StaticFileHandler को सेवा देने के लिए उपयोग करता है आपकी। एचटीएमएल फाइल।

वैकल्पिक रूप से आप अपने आईआईएस आवेदन के सामने एक रिवर्स प्रॉक्सी पर विचार कर सकते हैं जो एप्लिकेशन पूल की विनाशकारी विफलता के बावजूद एक दोस्ताना 500 पेज भी प्रदान करेगा। यह स्थापित करने के लिए और अधिक काम होगा, लेकिन कस्टमइरर्स से भी अधिक मजबूत होगा, उदा। यदि आपका web.config दूषित हो जाता है, यहां तक ​​कि कस्टमर भी काम नहीं करेंगे।

+1

आप एक अच्छा मुद्दा उठाते हैं कि ASP.NET पर निर्भर है। मैं ASP.NET पर निर्भरता प्राप्त करने के लिए 500.html का उपयोग कर रहा था, लेकिन अगर एएसपी.NET उत्तरदायी नहीं है तो यह म्यूट है। मुझे लगता है कि मेरी सबसे अच्छी शर्त में 500.aspx का उपयोग करना है, और ASP.NET नीचे होने पर आईआईएस स्तर पर बैकअप 500.html त्रुटि पृष्ठ कॉन्फ़िगर किया गया है। – frankadelic

1

इस तरह अपने कस्टम त्रुटियाँ अनुभाग को विन्यस्त का प्रयास करें:

<customErrors mode="On" redirectMode="ResponseRewrite"> 
    <error statusCode="500" redirect="500.aspx"> 
</customErrors> 

अपने 500.aspx फ़ाइल में Page_Load में प्रतिक्रिया कोड बदलने;

Response.StatusCode = 500; 
Response.StatusDescription = "Internal Server Error"; 
+0

मुझे redirectMode = "ResponseRewrite" का उपयोग करने की आवश्यकता है, इसलिए यह मेरे लिए एक विकल्प नहीं है। – frankadelic

+0

इसके अलावा, आपका समाधान 500 HTTP स्थिति नहीं भेजता है ... जैसा लिखा है, यह 500.html पर 302 रीडायरेक्ट करता है। 500.html में 200 HTTP स्थिति है। इसे फायरबग में देखें। – frankadelic

+0

प्रश्न के लिए संशोधित उत्तर। –

4

अपने gllobal.asax फ़ाइल में निम्न कोड जोड़ने

protected void Application_EndRequest(object sender, EventArgs e) 
    { 
     if (Request.Url.AbsolutePath.EndsWith("500.html")) 
      Response.StatusCode = 500; 
    } 
+0

क्या आईआईएस 7 + एकीकृत पाइपलाइन की आवश्यकता है? .html के लिए अनुरोध अन्यथा आग नहीं डालेंगे एप्लिकेशन_इंडरक्वेट .. – frankadelic

+0

क्षमा करें मैंने त्रुटि पृष्ठ एक्सटेंशन पर ध्यान नहीं दिया है, क्या यह एएसपीएक्स पेज होने में कोई समस्या है। आपको उस मामले में आईआईएस चिंता करने की ज़रूरत नहीं है। अगर मैं गलत नहीं हूं IIS 6 में HTML अनुरोध को एस्पनेट हैंडलर को रीडायरेक्ट करने के तरीके भी हो सकते हैं। मेरे पास आईआईएस 6 के साथ एक मशीन तक पहुंच नहीं है, अभी इंस्टॉल किया गया है –

+0

मेरा दूसरा बुलेट प्वाइंट देखें ... इसे एक स्थिर एचटीएमएल फाइल होना चाहिए। – frankadelic

3

ठीक है, मैं एक समाधान, एक ही रास्ता मैं काम करने के लिए इस वेब में कस्टम त्रुटियाँ अनुभाग को दरकिनार कर रहा है प्राप्त कर सकते हैं विन्यास फाइल।

तो, एक उदाहरण default.aspx

public partial class Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     throw new Exception("boom"); 
    } 
} 

फिर Global.asax फ़ाइल में:

protected void Application_Error(object sender, EventArgs e) 
{ 
    // Clear the error to take control of process 
    Server.ClearError(); 

    Response.WriteFile(Server.MapPath("500.html")); 
    Response.StatusCode = 500; 
    Response.StatusDescription = "Internal Server Error"; 
} 

आप शायद 500.html भाग के लिए एक बेहतर हैंडलिंग तंत्र लिख सकते हैं - मुझे लगता है कि ऐसा करना चाहिए जो आप हासिल करने की कोशिश कर रहे हैं।

केवल वीएस कैसिनी वेब सर्वर के साथ परीक्षण किया गया, हालांकि मुझे कोई कारण नहीं दिख रहा कि यह iis6 में क्यों काम नहीं करना चाहिए।

-1

यदि आप कोर HTTP सिग्नलिंग को बदलने पर जोर देते हैं तो आपको या तो कुछ मांगों को देना होगा या अपना खुद का वेब सर्वर लिखने के लिए तैयार रहना होगा। हां आपको आईआईएस 7 एकीकृत ऐपपूल चलाने की ज़रूरत है और आपको अभी भी नकली करने की कोशिश कर रहे हैं क्योंकि आपका सर्वर डाउन है और सर्वर नकली आत्महत्या के लिए डिज़ाइन नहीं किया गया है। इसलिए यदि यह आपको ऐसा करने का एक पतला तरीका देता है, तो आपके विकल्प या तो धन्यवाद या अपना स्वयं का, गैर-HTTP अनुपालन सर्वर विकसित करना होगा जो इच्छानुसार प्रतिक्रिया कोड को डरावना करेगा।

+0

इसे आज़माएं: क्लासिक .asp पृष्ठ को शून्य (1/0) से विभाजित करें और इसे निष्पादित करें। आप देखेंगे कि एक स्थिर त्रुटि पृष्ठ रिटर्न और HTTP स्थिति वास्तव में 500 है (फ़ायरबग या fiddler2 का उपयोग करने की पुष्टि करें)। यह सर्वर मौत/आत्महत्या नहीं है, इसका मतलब है कि एक त्रुटि हुई। नहीं "कोर http सिग्नलिंग" बदल दिया गया था। आप IIS प्रबंधक> त्रुटि पेज का उपयोग कर त्रुटि पृष्ठ सामग्री को पुन: कॉन्फ़िगर कर सकते हैं ... मेरी समस्या यह है कि यह सेटिंग .aspx पृष्ठों पर लागू नहीं होती है। मैं web.config में में एक .html फ़ाइल पर रीडायरेक्ट डाल सकता हूं, लेकिन परिणामी पृष्ठ 200 स्थिति देता है। – frankadelic

+0

क्या आप कह रहे हैं कि एक आंतरिक सर्वर त्रुटि (उदाहरण के लिए अपवाद से) सही http स्थिति कोड 302 है? या 200? 302 या 200 स्टेटस कोड लौट रहा है जो बेहद खराब नहीं है? : -> – Myster

+0

एकमात्र चीज जो "scrambled" है त्रुटि कोड के एएसपी.NET हैंडलिंग है। अपवाद और लौटने और त्रुटि पृष्ठ को फेंकना 200 या 302 के प्रतिक्रिया कोड का उत्पादन नहीं करना चाहिए। यह "कुछ तोड़ने" को इंगित करने के लिए 500 होना चाहिए। –

0

यह एक आईएसपीआई फ़िल्टर के साथ किया जा सकता है। इसे सी में लिखा जाना होगा, लेकिन यह .html अनुरोध के लिए प्रतिक्रिया स्थिति को संशोधित कर सकता है ताकि ब्राउजर आपके कस्टम एचटीएमएल पेज 500 के साथ हो।

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