अद्यतन
जब से यह उत्तर एक समाधान प्रदान करता है, मैं इसे संपादित नहीं करूंगा, लेकिन मैंने इस समस्या को हल करने का एक बहुत ही स्वच्छ तरीका पाया है। देखें मेरे अन्य जवाब जानकारी के लिए ...
मूल उत्तर:
मुझे पता लगा कि Application_Error()
विधि को क्यों लागू नहीं किया जा रहा है ...
Global.asax.cs
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute()); // this line is the culprit
}
...
}
डिफ़ॉल्ट रूप से (जब एक नई परियोजना उत्पन्न होती है), एक एमवीसी एप्लिकेशन में Global.asax.cs
फ़ाइल में कुछ तर्क होते हैं । इस तर्क का उपयोग मार्गों को मैप करने और फ़िल्टर को पंजीकृत करने के लिए किया जाता है। डिफ़ॉल्ट रूप से, यह केवल एक फ़िल्टर पंजीकृत करता है: एक HandleErrorAttribute
फ़िल्टर। जब CustomErrors चालू होता है (या दूरस्थ अनुरोधों के माध्यम से जब इसे RemoteOnly पर सेट किया जाता है), HandleErrorAttribute MVC को त्रुटि दृश्य देखने के लिए कहता है और यह कभी भी Application_Error()
विधि को नहीं कहता है । मुझे इसका दस्तावेज़ीकरण नहीं मिला लेकिन प्रोग्रामर.स्टैकएक्सचेंज डॉट कॉम पर इस उत्तर में बताया गया है ।
ApplicationError () विधि को हर अखंडित अपवाद के लिए कहा जाता है, सरल लाइन को हटा दें जो HandleErrorAttribute फ़िल्टर को पंजीकृत करता है।
अब समस्या यह है कि आप जो चाहते हैं उसे प्राप्त करने के लिए customErrors को कैसे कॉन्फ़िगर करें ...
CustomErrors खंड के लिए चूक redirectMode="ResponseRedirect"
। आप MVC मार्ग होने के लिए defaultRedirect विशेषता को भी निर्दिष्ट कर सकते हैं। मैंने एक ErrorController बनाया जो बहुत सरल था और इस तरह दिखने के लिए मैंने अपना web.config बदल दिया ...
web.config
<customErrors mode="RemoteOnly" redirectMode="ResponseRedirect" defaultRedirect="~/Error">
<error statusCode="404" redirect="~/Error/PageNotFound" />
</customErrors>
इस समाधान के साथ समस्या यह है कि यह आपके त्रुटि URL में एक 302 रीडायरेक्ट करता है और फिर वे पृष्ठ 200 स्थिति कोड के साथ प्रतिक्रिया करते हैं। इससे Google उन त्रुटि पृष्ठों को अनुक्रमित करता है जो खराब हैं। यह HTTP युक्ति के बहुत अनुरूप नहीं है। मैं जो करना चाहता था वह पुनर्निर्देशित नहीं था, और अपने कस्टम त्रुटि विचारों के साथ मूल प्रतिक्रिया को ओवररिट कर दिया।
मैंने बदलने की कोशिश की redirectMode="ResponseRewrite"
। दुर्भाग्य से, यह विकल्प MVC मार्गों का समर्थन नहीं करता है , केवल स्थैतिक HTML पृष्ठ या ASPX। मैंने पहली बार एक स्थिर HTML पृष्ठ का उपयोग करने की कोशिश की लेकिन प्रतिक्रिया कोड अभी भी 200 था लेकिन, कम से कम यह पुनर्निर्देशित नहीं हुआ। मुझे तब इस उत्तर से एक विचार आया ...
मैंने त्रुटि से निपटने के लिए एमवीसी को छोड़ने का फैसला किया। मैंने Error.aspx
a और a बनाया PageNotFound.aspx
। ये पृष्ठ बहुत सरल थे लेकिन इनमें एक जादू था ...
<script type="text/C#" runat="server">
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Response.StatusCode = (int) System.Net.HttpStatusCode.InternalServerError;
}
</script>
यह ब्लॉक पेज को सही स्थिति कोड के साथ परोसा जाना बताता है। मोटे तौर पर, PageNotFound.aspx पेज पर, मैंने HttpStatusCode.NotFound
इसके बजाय इस्तेमाल किया। मैंने अपने web.config को इस तरह से बदला ...
<customErrors mode="RemoteOnly" redirectMode="ResponseRewrite" defaultRedirect="~/Error.aspx">
<error statusCode="404" redirect="~/PageNotFound.aspx" />
</customErrors>
यह सब पूरी तरह से काम किया!
सारांश:
- लाइन निकालें:
filters.Add(new HandleErrorAttribute());
Application_Error()
अपवादों को लॉग करने के लिए विधि का उपयोग करें
- ASPX पृष्ठों पर इंगित करते हुए, ResponseRewrite के साथ customErrors का उपयोग करें
- ASPX पृष्ठों को अपनी प्रतिक्रिया स्थिति कोड के लिए जिम्मेदार बनाएं
इस समाधान के साथ मैंने कुछ युगल देखे हैं।
- ASPX पेज रेज़र टेम्प्लेट के साथ कोई भी मार्कअप साझा नहीं कर सकते हैं, मुझे लगातार नज़र और महसूस के लिए हमारी वेबसाइट के मानक हेडर और फ़ूटर मार्कअप को फिर से लिखना पड़ा।
- * .Aspx पृष्ठों को सीधे उनके URL को मारकर एक्सेस किया जा सकता है
इन समस्याओं के लिए काम के आस-पास हैं, लेकिन मैं उनके द्वारा किसी भी अतिरिक्त काम करने के लिए पर्याप्त चिंतित नहीं था।
मुझे आशा है कि यह सभी की मदद करता है!