چطور خطاها را در ASP.Net Web API مدیریت کنیم؟
در این مطلب قصد داریم در مورد مدیریت خطا در asp.net web api توضیح دهیم.
ASP.Net Web API شرکت مایکروسافت یک فریمورک سبک بوده که میتوانید از آن برای ساخت سرویس های RESTful که بر روی HTTP اجرا میشوند، استفاده کنید، استثناها خطاهایی هستند که در زمان اجرا رخ می دهند، مدیریت استثناها تکنیک مدیریت خطاهای زمان اجرا در کدهای اپلیکیشن شماست.
توسعه دهنده ASP.Net Web API باید بداند که چطور خطاها را در Web API مدیریت کند، این توسعه دهنده باید بداند که چطور کد های خطا و یا پیغام های مربوط به آن را از متدهای کنترلر ارسال کند. در بخش زیر نحوه انجام این کار را به شما آموزش خواهیم داد.
استفاده از HttpResponseException در ASP.Net Web API
می توانید از کلاس HttpResponseException برای برگشت کدهای وضعیت HTTP و پیغام های مرتبط از متدهای یک کنترلر در Web API استفاده کنیم. مثالی در این مورد در زیر آمده است :
public Employee GetEmployee(int id) { Employee emp = employeeRepository.Get(id); if (emp == null) { var response = new HttpResponseMessage(HttpStatusCode.NotFound) { Content = new StringContent("Employee doesn't exist", System.Text.Encoding.UTF8, "text/plain"), StatusCode = HttpStatusCode.NotFound } throw new HttpResponseException(response); } return emp; }
اگر Web API شما IHttpActionResult را بازگرداند ممکن است بخواهید متد GetEmployee را به شکل زیر پیاده سازی کنید :
public IHttpActionResult GetEmployee(int id) { Employee emp = employeeRepository.Get(id); if (emp == null) { var response = new HttpResponseMessage(HttpStatusCode.NotFound) { Content = new StringContent("Employee doesn't exist", System.Text.Encoding.UTF8, "text/plain"), StatusCode = HttpStatusCode.NotFound } throw new HttpResponseException(response); } return Ok(emp); }
دقت داشته باشید که کد های خطا و پیغام های مرتبط با آن ها به شی response انتساب داده شدهاند و نمونه ای از HttpResponseException زمانی که یک استثنا در متد رخ دهد، بازگردانده می شود.
استفاده از HttpError در ASP.Net Web API
میتوانید از متد CreateErrorResponse در کد خود برای بازگشت کدهای خطای معنی دار و پیغام های مرتبط با آن استفاده کنید. دقت داشته باشید که متد CreateErrorResponse شی ای از جنس HttpError را ایجاد کرده و سپس آن را داخل شیء HttpResponseMessage استفاده میکند. کدی در زیر آورده شده است، نشان میدهد که چطور میتوان از متد CreateErrorResponse استفاده کرد :
public IActionResult GetEmployee(int id) { Employee emp = employeeRepository.Get(id); if (emp == null) { string message = "Employee doesn't exist"; throw new HttpResponseException( Request.CreateErrorResponse(HttpStatusCode.NotFound, message)); } return Ok(emp); }
به متد ()GetEmployee در بالا رجوع کنید، این متد یک شناسه employee را به عنوان پارامتر دریافت کرده و از این شناسه برای جستجو و برگرداندن یک رکورد employee استفاده می کند. اگر رکورد مربوطه با توجه به آیدی مشخص شده پیدا نشود، نمونه ای از HttpResponseException رخ خواهد داد، دقت کنید که چطور پیغام خطای مناسب قبل از این که استثنایی رخ دهد، ایجاد شده است.
استفاده از فیلترهای استثنا در ASP.Net Web API
فیلتر های استثنا فیلتر هایی هستند که می توانند برای مدیریت خطاهای غیر قابل کنترل که در متدهای controller تولید میشوند استفاده شوند. به عبارتی دیگر میتوانید از فیلترهای استثنا برای گرفتن خطاهای غیر مدیریت شده در Web API استفاده کنید. دقت داشته باشید که استفاده از فیلترهای استثنای سراسری زمانی در متد شما استثنایی غیر قابل کنترل رخ دهد می تواند بسیار مناسب باشد.
برای ساخت یک فیلتر استثنا باید اینترفیس IExceptionFilter را پیاده سازی کنیم. شما همچنین می توانید فیلتر های استثنا را با گسترش دادن کلاس آبسترکت ExceptionFilterAttribute و سپس بازنویسی کردن متد OnException انجام دهید. توجه داشته باشید که کلاس ExceptionFilterAttribute خود اینترفیس IExceptionFilter را پیاده سازی می کند.
نمونه کد زیر نشان می دهد که چطور می توان یک فیلتر استثنای سفارشی شده را با گسترش کلاس ExceptionFilterAttribute به انجام رساند :
public class CustomExceptionFilter : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext actionExecutedContext) { HttpStatusCode status = HttpStatusCode.InternalServerError; String message = String.Empty; var exceptionType = actionExecutedContext.Exception.GetType(); if (exceptionType == typeof(UnauthorizedAccessException)) { message = "Access to the Web API is not authorized."; status = HttpStatusCode.Unauthorized; } else if (exceptionType == typeof(DivideByZeroException)) { message = "Internal Server Error."; status = HttpStatusCode.InternalServerError; } else { message = "Not found."; status = HttpStatusCode.NotFound; } actionExecutedContext.Response = new HttpResponseMessage() { Content = new StringContent(message, System.Text.Encoding.UTF8, "text/plain"), StatusCode = status }; base.OnException(actionExecutedContext); } }
سپس باید فیلتر استثنای سفارشی خود را به مجموعه فیلترهای شی HttpConfiguration اضافه کنید :
public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); config.Formatters.Remove(config.Formatters.XmlFormatter); config.Filters.Add(new CustomExceptionFilter()); }
میتوانید فیلتر استثنای خود را با استفاده از یکی از سه روش زیر ثبت کنید :
- در سطح Action
- در سطح Controller
- سراسری
نمونه کد زیر نشان می دهد که چطور می توان یک فیلتر را در سطح Action اعمال کرد :
public class EmployeesController : ApiController { [NotImplementedExceptionFilter] public Employee GetEmployee(int id) { throw new NotImplementedException(); } }
برای اعمال فیلتر استثنا در سطح Controller می توانید به شکل زیر عمل کنید :
[DatabaseExceptionFilter] public class EmployeesController : ApiController { //Some code }
در صورتی که می خواهید فیلتر استثنای خود را به صورت سراسری بر روی همه کنترلر ها اعمال کنید به صورت زیر عمل کنید :
GlobalConfiguration.Configuration.Filters.Add(new DatabaseExceptionFilterAttribute());