मैं चारों ओर पाने के लिए कर रहा था .NET 3.5 का उपयोग कर एएसपीनेट वेबफॉर्म में निम्न सेटअप का उपयोग करके यह समस्या।
मैंने जो पैटर्न लागू किया है, वह वेब.config में .NET के कस्टम रीडायरेक्ट समाधान को बाईपास करता है क्योंकि मैंने हेडर में सही HTTP स्थिति कोड के साथ सभी परिदृश्यों को संभालने के लिए अपना स्वयं लिखा है।
पहले, web.config के customErrors अनुभाग इस तरह दिखता है:
<customErrors mode="RemoteOnly" defaultRedirect="~/error.htm" />
इस सेटअप सुनिश्चित करता है कि customErrors मोड पर करने के लिए एक सेटिंग हम बाद में की आवश्यकता होगी सेट किया गया है, और एक सब बाकी-विफल रहता है प्रदान करता है error.htm के डिफ़ॉल्टRedirect के लिए विकल्प। यह आसान होगा जब मेरे पास विशिष्ट त्रुटि के लिए हैंडलर नहीं है, या टूटा डेटाबेस कनेक्शन की तरह कुछ है।
दूसरा, यहां वैश्विक asax त्रुटि घटना है:
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();
}
}
इस कोड को एक और वर्ग के लिए त्रुटि से निपटने की जिम्मेदारी बंद गुजर रहा है। अगर त्रुटि को संभाला नहीं जाता है और कस्टमरर चालू हो जाता है, तो इसका मतलब है कि हमारे पास एक ऐसा मामला है जहां हम उत्पादन पर हैं और किसी भी तरह से एक त्रुटि को संभाला नहीं गया है। उपयोगकर्ता इसे देखने से रोकने के लिए हम इसे यहां साफ़ कर देंगे, लेकिन इसे एल्मा में लॉग इन करें ताकि हम जान सकें कि क्या हो रहा है।
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() का उपयोग करना महत्वपूर्ण है, क्योंकि लगभग हर त्रुटि को उच्च-स्तरीय अपवाद में लपेटा जाएगा। उदाहरण के लिए, किसी भी एएसपीएक्स पेज से "नई प्रणाली फेंक दें। अपवाद()" परिणामस्वरूप इस स्तर पर एक HttpUnhandledException प्राप्त किया जा रहा है, सिस्टम नहीं। अपवाद।
"फैक्टरी" कोड सरल है और इस तरह दिखता है:
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);
//default value here:
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();
}
अंत में, मैं एक विस्तृत त्रुटि हैंडलिंग योजना सेटअप मिल गया है। परिभाषित किए गए "व्यवहार" में से प्रत्येक में, मेरे पास त्रुटि के प्रकार के लिए एक कस्टम कार्यान्वयन है। उदाहरण के लिए, स्टेटस कोड के लिए एक एचटीपी अपवाद का निरीक्षण किया जाएगा और उचित तरीके से संभाला जाएगा। एक 404 स्टेटस कोड को सर्वर की आवश्यकता होगी। हेडर में लिखे उचित स्थिति कोड के साथ, Request.Redirect के बजाय ट्रांसफर।
उम्मीद है कि इससे मदद मिलती है।
ब्राउज़र स्थिति क्या है? मैं फ़ायरफ़ॉक्स के लिए एडन हैडर जासूस का उपयोग करता हूं। –
हैडर जासूस प्रतिक्रिया: HTTP/1.1 404 नहीं मिला दिनांक: सूर्य, 07 दिसंबर 2008 06:21:20 GMT –
क्या आप एक मास्टर पेज का उपयोग कर रहे हैं? शायद यह है। मैं एक मास्टर पेज का उपयोग किए बिना एक पेज आज़माउंगा ... –