DEV Community

MustafaSamedYeyin
MustafaSamedYeyin

Posted on

Asp.net core Middleware; Custom Middleware Giriş.

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?}");
            });
        }
Enter fullscreen mode Exit fullscreen mode

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

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.
        }
    }
Enter fullscreen mode Exit fullscreen mode

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>();
        }
    }
Enter fullscreen mode Exit fullscreen mode

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();

Enter fullscreen mode Exit fullscreen mode

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?}");
            });
        }
Enter fullscreen mode Exit fullscreen mode

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

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

Top comments (0)