Post Page Advertisement [Top]

   Merhaba,
   Bu yazımda .Net Core' da middleware yapısından bahsedeceğim. Daha önce Aspect Oriented ile ilgili yazımda bahsettiğim interceptor 'ların yerini aslında .Net Core'da Middleware 'ler alıyor. Bizim için oldukça yaralı olan middleware'ler ile ilgili bir örnek yaparak konuyu anlamaya çalışalım.



 Middleware 'ler adından da anlaşılacağı gibi uygulama pipeline' nının ortasında yar alan request ve response' ları handle eden bir yapı. Aşağıdaki görsel bunu daha net anlatıyor.

Okurken ne dinlemeli?



Aşağıdaki gibi bir .Net Core MVC projesi oluşturalım ve çok kolay bir şekilde Exception Handling gerçekleştirelim.



Projemiz aşağıdaki gibi bir yapıda olacaktır. Kullanacağımız middleware' leri tek bir yerde toplamak adına Middlewares klasörü oluşturdum. Yeni bir sınıf yaratarak ismini ExceptionHandlerMiddleware koyalım.


    Basit bir middleware RequestDelegate parametresini alan bir constructor'dan ve Invoke metod' undan oluşur.   await next(); ile request icra edilir. Öncesinde ve sonrasında yapmak istediğimiz işlemleri gerçekleştirebiliriz.

        public class ExceptionHandlerMiddleware
        {
            private readonly RequestDelegate _next;

            public ExceptionHandlerMiddleware(RequestDelegate next)
            {
                _next = next;
            }

            public async Task Invoke(HttpContext httpContext)
            {
                await _next(httpContext);
            }

        }

 Biz isteği try catch bloguna alarak exception yakalayacağız ve yakaladığımız hatayı da bir txt file 'a yazacağız. Bunu yaparken de bir dependency injection gerçekleştireceğiz. log' ların hangi path' da olacağını belirlemek için kullanacağımız parametreyi IHostingEnvironment ile Invoke metoduna parametre olarak vermemiz yeterli olacak. Bu durumda Exception middleware' nin son hali aşağıdaki gibi olacaktır.


    public class ExceptionHandlerMiddleware
    {
        private readonly RequestDelegate _next;

        public ExceptionHandlerMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext httpContext, IHostingEnvironment hostingEnvironment)
        {
            try
            {
                await _next(httpContext);
            }
            catch (Exception e)
            {
                Log(httpContext, e, hostingEnvironment);
                throw;
            }
        }

        private void Log(HttpContext context, Exception exception, IHostingEnvironment hostingEnvironment)
        {
            var savePath = hostingEnvironment.WebRootPath;
            var now = DateTime.UtcNow;
            var fileName = $"{now.ToString("yyyy_MM_dd")}.log";
            var filePath = Path.Combine(savePath, "logs", fileName);

            // ensure that directory exists
            new FileInfo(filePath).Directory.Create();

            using (var writer = File.CreateText(filePath))
            {
                writer.WriteLine($"{now.ToString("HH:mm:ss")} {context.Request.Path}");
                writer.WriteLine(exception.Message);
            }
        }
    }


Uygulamamızın pipeline 'nında yer alması için Startup.cs class' ına aşağıdaki kodu ekleyelim.


           app.UseMiddleware<ExceptionHandlerMiddleware>();


.Net Core web uygulamamızı çalıştır dediğimizde aşağıdaki gibi bir ekran karşımıza çıkar.

     Şimdi bir hata oluşturup yazdığımız middleware' ye de breakpointler koyalım ve gerçekten exception zamanında buraya düştüğünü görelim ve wwwroot altında logs klasörünün oluşup hata logunun burda .txt olarak yazdığını görelim. Hata oluşturmak için HomeController 'a aşağıdaki gibi hatalı bir DateTime conversion yazıyorum.

    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            DateTime dateTime = Convert.ToDateTime("S2019 - 01 - 22 1:21 ÖS40");
            return View();

        }

Uygulamamızı çalıştıralım ve datetime çevriminde hata aldığımız görelim ve .txt dosyamız aşağıdaki gibi olur.


 .Net Core middleware  kolaylığını sağlayan aslında Kestrel çünkü Request' lerin pipeline geçmesini ve cevabı alarak geri döndürülmesini sağlar, dolayısı ile sadece Core MVC değil ,Core API ve diğer projelerde de aynı şekilde middleware oluşturulabilir.Birden çok middleware de oluşturabilirsiniz. Authorization için, logging için vb.

Projenin tam haline buradan ulaşabilirsiniz.

Kaynaklar:
https://softdevpractice.com/blog/asp-net-core-global-exception-handler-middleware/
https://www.thomaslevesque.com/2018/03/27/understanding-the-asp-net-core-middleware-pipeline/

Sağlıkla kalın,
Huzurlu kalın.

Hiç yorum yok:

Yorum Gönder

Bottom Ad [Post Page]