Asp.net core Middleware; Custom Middleware Giriş.
Tags: dotnet, csharp
Published: 2021-10-14 19:39:51

Run, Use, Map, MapWhen adlı middleware'leri gördük.

Şimdi aşağıdaki middleware'leri inceleyelim : 

```
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();
            
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
```

Gördüğünüz üzere app.Use... diye devam ediyor. Peki biz böyle bir middleware'i nasıl oluştururabiliriz ?

Hadi hemen Örneğe geçelim, bir model-view-controller uygulaması yaratalım ve aşağıdaki adımlar ile devam edelim : 

a.) Aşağaıdaki gibi Extensions ve Middlewares adlı klasör oluşturalım. Extensions içine MiddlewareExtensions adlı class'ı yaratalım. Middlewares adlı klasör içine PathYakalaMiddleware adlı class'ı yaratalım.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q6hxrffunfy1kpv12l9f.png)
 
b.) PathYakalaMiddleware class'ı aşağıdaki gibi olmalıdır.

```
public class PathYakalaMiddleware
    {
        RequestDelegate _next;

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

        public async Task Invoke(HttpContext httpContext)
        {
            Console.WriteLine(httpContext.Request.Path); //Burada  httpContext nesnesi üzerinden istek yapılan path'i console'a loglluyoruz.
            await _next(httpContext); // burada RequestDelegate  üzerinden bu middleware'den sonra diğer middleware çağrılmasını istiyoruz. Eğer bu await _next(httpContext); bu ifadeyi kullanmaz isek uygulamımız short circuit yapar ve bir dahaki middleware uygulama geçemez.
            Console.WriteLine("Yukarıdaki Path Yakalandı"); // pipeline geriye doğru akmaya başladığında bu mesajı yazdırıyoruz.
        }
    }
```

b.) MiddlewareExtensions class'ımız ile IApplicationBuilder'a extension yazıyoruz. 

```
static public class MiddlewareExtensions
    {
        public static IApplicationBuilder UsePathLogger(this IApplicationBuilder applicationBuilder)
        {
            return applicationBuilder.UseMiddleware<PathYakalaMiddleware>();
        }
    }
```

applicationBuilder.UseMiddleware<....>(); ile .... olan yere custom middleware'imizi yani PathYakalaMiddleware veriyoruz. 

c.) UseRouting middleware'inden sonra UsePathLogger adlı yazdığımız extension metodumuzu Startup.cs içersindeki Configure metoduna verelim.

```
app.UseRouting();
app.UsePathLogger();

```

Not: Configure metodmuz aşağıdakine benzer olmalıdır :

```
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();
            app.UsePathLogger(); // burayı ekledik
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
        }
```

d.) Şimdi "dotnet run" ile uygulamamızı çalıştıralım.

Ve 
https://localhost:5001/
adlı yere rastgele path'ler verlim örneğin : 
https://localhost:5001/rastgeleBirPath

Terminale şimdi bakalım : 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mi6o1y42dh7b62ltait7.png) 

Gördüğünüz üzere girdiğimiz path'ler console'da loglanıyor.

Siz de kendi ihtiyaçlarınıza göre yeni middleware yazabilirsiniz.

Bir dahaki yazıda görüşmek dileğiyle.

En iyi dileklerim ile. 

Mustafa Samed Yeyin.

Referans : https://www.youtube.com/watch?v=BdNZ9gzsQdg&list=PLQVXoXFVVtp33KHoTkWklAo72l5bcjPVL&index=47&ab_channel=Gen%C3%A7ayY%C4%B1ld%C4%B1z