.Net Core Custom Exception Middleware Oluşturalım

By | 11 Ocak 2018

.Net Core API yazarken bazı durumlardan dolayı custom middleware  yazma ihtiyacınız oluşabilir. Authentication, MVC, ErrorHandling gibi işlemler için middleware kullanırız.  Bu makalede örnek bir custom error middleware oluşturup nasıl kullanılır birlikte inceleyelim.

Eğer throw new Exception(“Bir hata oluştu”);  ile hata veya uyarı mesajı fırlatmak istiyorsanız geriye html bir hata mesajı döndüğünü göreceksiniz. Javascript tarafında ise bunu json parse edemeyeceğiniz için hata mesajına ulaşmanız zorlaşacak. Bunun yerine kendi Exception Model ‘imizi oluşturup bunun içini doldurarak json yapısında geriye döndürmemiz gerekir. tabi throw edilmiş bir hata mesajı API den çıkmadan yakalayıp bu işlemleri yapabilmemiz gerekiyor. İşte tam da burada Middleware yapısı devreye giriyor.

Öncelikle ExceptionModel sınıfımızı oluşturalım. Bu sınıfın içerisine exception message, status code gibi bilgileri doldurup geriye döndürebileceğiz. Siz kendi ihtiyacınıza göre property ekleyebilirsiniz.

public class ExceptionResponse
{
  public int StatusCode { get; }
  
  [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
  public string Message { get; }
  
  public ApiResponse(string message, int statusCode=500)
  {
    StatusCode = statusCode;
    Message = message;
  }
}

 

Şimdi  ise hata oluştuğunda onu yakalayıp modelin içine mesaj bilgisini yazan ve geriye json’a serialize ederek döndüren ErrorMiddleware sınıfımızı yazalım.


public class ErrorMiddleware
{
  private readonly RequestDelegate _next;
  
  public ErrorMiddleware(RequestDelegate next)
  {
    _next = next;
  }
  
  public async Task Invoke(HttpContext context)
  {
    string message = "";
    try
    {
      await _next.Invoke(context);
    }
    catch (Exception ex)
    {
      message = ex.Message;
    }
  
    if (!context.Response.HasStarted)
    {
      context.Response.ContentType = "application/json";
      var response = new ExceptionModel(message);
      var json = JsonConvert.SerializeObject(response);
      await context.Response.WriteAsync(json);
    }
  }
}

// Extension method ile IApplicationBuilder altına custom methodumuzu eklenmesini sağlıyoruz.
public static class ErrorMiddlewareExtensions
{
  public static IApplicationBuilder UseErrorWrappingMiddleware(this IApplicationBuilder builder)
  {
    return builder.UseMiddleware<ErrorMiddleware>();
  }
}

Son olarak Startup.cs içinde Configure methoduna aşağıdaki gibi kodları ekliyoruz.

public void Configure(IApplicationBuilder app)
{
  app.UseErrorMiddleware();
}

Artık bir hata oluştuğunda yazdığımız custom ErrorMiddleware yapısı araya girerek hatayı JSON formatında geriye döndürecektir.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir