পটভূমি
আমি একটি ক্লায়েন্টের জন্য একটি এপিআই পরিষেবা স্তর বিকাশ করছি এবং বিশ্বব্যাপী সমস্ত ত্রুটিগুলি ধরা এবং লগ করার জন্য আমাকে অনুরোধ করা হয়েছে।
সুতরাং, যখন কোনও অজানা এন্ডপয়েন্ট (বা ক্রিয়া) এর মতো কিছু সহজেই ELMAH ব্যবহার করে বা এর মতো কিছু যুক্ত করে সহজেই পরিচালনা করা হয় Global.asax
:
protected void Application_Error()
{
Exception unhandledException = Server.GetLastError();
//do more stuff
}
। । .হানডেলড ত্রুটিগুলি যা রাউটিংয়ের সাথে সম্পর্কিত নয় লগ হয় না। উদাহরণ স্বরূপ:
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
উপরের দিকে কল করে উত্পন্ন যেমনটির মতো ত্রুটিগুলি কীভাবে আমি বাধা দেব যাতে আমি সেগুলি লগইন করতে পারি? দেখে মনে হচ্ছে এই উত্তরটি সুস্পষ্ট হওয়া উচিত, তবে আমি এতক্ষণ যা ভাবতে পারি তার সব চেষ্টা করেছি।
আদর্শভাবে, আমি ত্রুটি লগিংয়ে কিছু জিনিস যুক্ত করতে চাই যেমন অনুরোধকারী ব্যবহারকারীর আইপি ঠিকানা, তারিখ, সময় এবং আরও কিছু। আমি কোনও ত্রুটি দেখা দিলে সহায়তা কর্মীদের স্বয়ংক্রিয়ভাবে ইমেল করতে সক্ষম হতে চাই। এই সমস্ত ত্রুটিগুলি যখন ঘটে তখনই কেবল আমি সেগুলি বন্ধ করতে পারি যদি আমি এই সমস্ত করতে পারি!
মীমাংসা!
ডারিন দিমিত্রভকে ধন্যবাদ, যার উত্তর আমি মেনে নিয়েছি, আমি এটি খুঁজে পেয়েছি। ওয়েবএপিআই নিয়মিত এমভিসি নিয়ামক হিসাবে একইভাবে ত্রুটিগুলি পরিচালনা করে না ।
এখানে কি কাজ করেছে:
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]
বৈশিষ্ট্য সহ একটি একক নিয়ামককে সজ্জিত করতে পারেন ।