पृष्ठभूमि
मैं एक क्लाइंट के लिए एक एपीआई सर्विस लेयर विकसित कर रहा हूं और मुझसे विश्वभर की सभी त्रुटियों को पकड़ने और लॉग इन करने का अनुरोध किया गया है।
तो, जबकि एक अज्ञात समापन बिंदु (या कार्रवाई) की तरह कुछ ईएलएमएएच का उपयोग करके या इस तरह से कुछ जोड़कर आसानी से नियंत्रित किया जाता है Global.asax
:
protected void Application_Error()
{
Exception unhandledException = Server.GetLastError();
//do more stuff
}
। । .unhandled त्रुटियाँ जो रूटिंग से संबंधित नहीं हैं, वे लॉग इन नहीं होती हैं। उदाहरण के लिए:
public class ReportController : ApiController
{
public int test()
{
var foo = Convert.ToInt32("a");//Will throw error but isn't logged!!
return foo;
}
}
मैंने [HandleError]
इस फ़िल्टर को पंजीकृत करके विश्व स्तर पर विशेषता स्थापित करने की कोशिश की है :
filters.Add(new HandleErrorAttribute());
लेकिन वह भी सभी त्रुटियों को लॉग नहीं करता है।
समस्या / प्रश्न
मैं /test
ऊपर कॉल करके उत्पन्न की गई त्रुटियों को कैसे रोक सकता हूं ताकि मैं उन्हें लॉग इन कर सकूं? ऐसा लगता है कि यह उत्तर स्पष्ट होना चाहिए, लेकिन मैंने वह सब कुछ करने की कोशिश की है जो मैं अब तक सोच सकता हूं।
आदर्श रूप से, मैं त्रुटि लॉगिंग में कुछ चीजें जोड़ना चाहता हूं, जैसे कि अनुरोध करने वाले उपयोगकर्ता का आईपी पता, दिनांक, समय और आगे। मैं एक त्रुटि का सामना करने पर स्वचालित रूप से सहायक कर्मचारियों को ई-मेल करने में सक्षम होना चाहता हूं। यह सब मैं तभी कर सकता हूँ जब मैं इन त्रुटियों को रोक सकता हूँ जब वे होते हैं!
यह संकल्प!
डारिन दिमित्रोव के लिए धन्यवाद, जिनके उत्तर को मैंने स्वीकार किया, मुझे यह पता चला। WebAPI करता है नियमित एमवीसी नियंत्रक की तरह त्रुटियों को संभालता नहीं है ।
यहाँ काम किया है:
1) अपने नाम स्थान पर एक कस्टम फ़िल्टर जोड़ें:
public class ExceptionHandlingAttribute : ExceptionFilterAttribute
{
public override void OnException(HttpActionExecutedContext context)
{
if (context.Exception is BusinessException)
{
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent(context.Exception.Message),
ReasonPhrase = "Exception"
});
}
//Log Critical errors
Debug.WriteLine(context.Exception);
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
{
Content = new StringContent("An error occurred, please try again or contact the administrator."),
ReasonPhrase = "Critical Exception"
});
}
}
2) अब WebApiConfig वर्ग में विश्व स्तर पर फ़िल्टर को पंजीकृत करें :
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{action}/{id}", new { id = RouteParameter.Optional });
config.Filters.Add(new ExceptionHandlingAttribute());
}
}
या आप पंजीकरण को छोड़ सकते हैं और केवल एक नियंत्रक को [ExceptionHandling]
विशेषता के साथ सजा सकते हैं ।