Asp.Net Core Mvc İle Hata Yönetimi Nasıl Yapılır ?
Merhaba arkadaşlar uzun zamandır yazı yazmıyordum sebebi yoğun iş vs o şuanda vakit buldum ve bu konuda sizinle ActionFilterları göreceğiz ve yöneteceğiz.
Daha önce actionfilter hakkında bir şey duymadıysanız actionfilter şu işe yarar herhangi bir (Request) post get olaylarında her seferinde çalışır ve içerisinde çalışan action controller vs hakkında bilgiler bulunur.
İlk olarak bir MyExceptionFilter şeklinde bir class oluşturuyorum.
1 2 3 4 | public class MyExceptionFilter { } |
Şimdi class’ımı IExceptionFilter ‘a kalıtacağım.
1 2 3 4 | public class MyActionFilter : IExceptionFilter { } |
Daha sonra Override ediyoruz ve elimize OnException metodu geliyor
1 2 3 4 5 6 7 | public class MyActionFilter : IExceptionFilter { public void OnException(ExceptionContext context) { } } |
context adı ile gelen parametre ile action adı controller adı gibi bilgilere erişebilirsiniz.
1 2 3 4 5 6 7 8 | public class MyActionFilter : IExceptionFilter { public void OnException(ExceptionContext context) { var actionName = context.RouteData.Values["action"]; var controllerName = context.RouteData.Values["controller"]; } } |
Şimdi bu şekilde Controller ve Action’a ulaşabildik daha ne yapabiliriz derseniz burada action türüne göre sayfayı değiştirip örnek veriyorum Post ise redirect action verip hata sayfasına yönlendirebilirsiniz veya sayfalar js ile yönetiliyorsa json döndürüp sayfa içerisinde hataları okuyup hata mesajı verebilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class MyActionFilter : IExceptionFilter { public void OnException(ExceptionContext context) { var actionName = context.RouteData.Values["action"]; var controllerName = context.RouteData.Values["controller"]; context.ExceptionHandled = true; context.Result = new ViewResult { ViewName = "CustomError" }; } } |
Ben bir tane hata sayfasını açan bir örnek yapacağım result olarak viewresult yazıyorum içerisine viewname veriyorum. View’a nasıl erişeceğim nerede olacak diyorsanızda view dosyasındaki shared içerisine dosyayı açıp adını viewname’e verirseniz çalışacaktır.
1 | HttpStatusCode status = HttpStatusCode.InternalServerError; |
Şimdi ise ben status koduna bakayım sunucu hatası ise bu değilse vs buna yönlendireyim diyorsanız da bu şekilde status koduna ulaşıp 500 ise farklı 400 ise farklı vs sayfalara gönderebilirsiniz.
,
Ben bunları database’e kaydetmek istiyorum ama nasıl bir tablo oluşturmalıyım diyorsanız da sizin işinizi görecek bir model atayım codefirst kullanıyor iseniz sizin ciddi anlamda işinizi çözecektir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | public partial class ErrorEntity { public int ErrorEntityId { get; set; } public int? AppUserId { get; set; } public string MessageText { get; set; } public string InnerExceptionText { get; set; } public string SourceText { get; set; } public string StackTraceText { get; set; } public string ControllerName { get; set; } public string ActionName { get; set; } public string ParameterName { get; set; } public int? StatusCode { get; set; } public string Status { get; set; } public string UserBrowser { get; set; } public string UserIp { get; set; } public string ApiController { get; set; } public string ApiAction { get; set; } public string WebController { get; set; } public string WebAction { get; set; } public DateTime CreateDate { get; set; } public bool? IsActive { get; set; } public bool? IsDeleted { get; set; } public AppUser AppUser { get; set; } } |
Yazıyı burada bitireyim muhtemelen bir sonraki konu action filter ile loglama şeklinde olabilir ancak ana fikir zaten neredeyse aynı. Sürüm olarak 2.1 ve 3.1 de kodlar çalışmaktadır.