मैं .NET 3.5 का उपयोग करके asp.net वेबफ़ॉर्म में निम्न सेटअप का उपयोग करके इस समस्या को हल करने में सक्षम था।
जिस पैटर्न को मैंने कार्यान्वित किया है, वह web.config में .NET के कस्टम रीडायरेक्ट समाधान को बायपास करता है क्योंकि मैंने हेडर में सही HTTP स्थिति कोड के साथ सभी परिदृश्यों को संभालने के लिए अपना लिखा है।
सबसे पहले, web.config का customErrors खंड इस तरह दिखता है:
<customErrors mode="RemoteOnly" defaultRedirect="~/error.htm" />
यह सेटअप सुनिश्चित करता है कि CustomErrors मोड चालू है, एक सेटिंग जिसे हमें बाद में आवश्यकता होगी, और error.htm के defaultRedirect के लिए एक और सब-विफल-विकल्प प्रदान करता है। यह तब काम आएगा जब मेरे पास विशिष्ट त्रुटि के लिए कोई हैंडलर नहीं है, या एक टूटे हुए डेटाबेस कनेक्शन की तर्ज पर कुछ है।
दूसरा, यहां वैश्विक असैक्स त्रुटि घटना है:
protected void Application_Error(object sender, EventArgs e)
{
HandleError();
}
private void HandleError()
{
var exception = Server.GetLastError();
if (exception == null) return;
var baseException = exception.GetBaseException();
bool errorHandled = _applicationErrorHandler.HandleError(baseException);
if (!errorHandled) return;
var lastError = Server.GetLastError();
if (null != lastError && HttpContext.Current.IsCustomErrorEnabled)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(lastError.GetBaseException());
Server.ClearError();
}
}
यह कोड किसी अन्य वर्ग को त्रुटि को संभालने की जिम्मेदारी से गुजर रहा है। यदि त्रुटि को नियंत्रित नहीं किया गया है और CustomErrors चालू है, तो इसका मतलब है कि हमें एक मामला मिला है जहां हम उत्पादन पर हैं और किसी तरह एक त्रुटि को संभाला नहीं गया है। उपयोगकर्ता को इसे देखने से रोकने के लिए हम इसे यहाँ साफ़ कर देंगे, लेकिन इसे एल्माह में लॉग इन करें ताकि हम जान सकें कि क्या चल रहा है।
ApplicationErrorHandler वर्ग इस तरह दिखता है:
public bool HandleError(Exception exception)
{
if (exception == null) return false;
var baseException = exception.GetBaseException();
Elmah.ErrorSignal.FromCurrentContext().Raise(baseException);
if (!HttpContext.Current.IsCustomErrorEnabled) return false;
try
{
var behavior = _responseBehaviorFactory.GetBehavior(exception);
if (behavior != null)
{
behavior.ExecuteRedirect();
return true;
}
}
catch (Exception ex)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
}
return false;
}
यह वर्ग अनिवार्य रूप से जारी किए गए त्रुटि के प्रकार के लिए उपयुक्त त्रुटि हैंडलर का पता लगाने के लिए कमांड पैटर्न का उपयोग करता है। इस स्तर पर Exception.GetBaseException () का उपयोग करना महत्वपूर्ण है, क्योंकि लगभग हर त्रुटि उच्च-स्तरीय अपवाद में लपेटी जाएगी। उदाहरण के लिए, किसी भी aspx पृष्ठ से "थ्रो न्यू System.Exception ()" को करने से HttpUnhandledException इस स्तर पर प्राप्त होगी, न कि एक System.Exception।
"फ़ैक्टरी" कोड सरल है और इस तरह दिखता है:
public ResponseBehaviorFactory()
{
_behaviors = new Dictionary<Type, Func<IResponseBehavior>>
{
{typeof(StoreException), () => new Found302StoreResponseBehavior()},
{typeof(HttpUnhandledException), () => new HttpExceptionResponseBehavior()},
{typeof(HttpException), () => new HttpExceptionResponseBehavior()},
{typeof(Exception), () => new Found302DefaultResponseBehavior()}
};
}
public IResponseBehavior GetBehavior(Exception exception)
{
if (exception == null) throw new ArgumentNullException("exception");
Func<IResponseBehavior> behavior;
bool tryGetValue = _behaviors.TryGetValue(exception.GetType(), out behavior);
if (!tryGetValue)
_behaviors.TryGetValue(typeof(Exception), out behavior);
if (behavior == null)
Elmah.ErrorSignal.FromCurrentContext().Raise(
new Exception(
"Danger! No Behavior defined for this Exception, therefore the user might have received a yellow screen of death!",
exception));
return behavior();
}
अंत में, मुझे एक एक्स्टेंसिबल एरर हैंडलिंग स्कीम सेटअप मिला है। परिभाषित किए गए प्रत्येक "व्यवहार" में, त्रुटि के प्रकार के लिए मेरे पास एक कस्टम कार्यान्वयन है। उदाहरण के लिए, स्थिति कोड के लिए एक Http अपवाद का निरीक्षण किया जाएगा और उचित रूप से नियंत्रित किया जाएगा। हेडर में लिखे गए उपयुक्त स्टेटस कोड के साथ एक 404 स्टेटस कोड के लिए Request.Redirect के बजाय Server.Transfer की आवश्यकता होगी।
उम्मीद है की यह मदद करेगा।