Asp.net core Middleware; Run, Use Giriş.
Tags: dotnet, csharp
Published: 2021-10-14 14:45:36

Asp.net core'da Run, Use middleware'ini inceleyelim.

### 1.) Run middleware'i nedir ?

* Run middleware'i kendinden sonra gelen middleware'leri çalışmasını engeller.
* Run middleware'i short circuit yani kısa devre middleware'idir.

Örnek : 

a.) Boş bir model-view-controller projesi oluşturalım.

b.) Startup.cs class'ına Configure içinde app.UseStaticFiles(); dan sonraya aşağıdaki kodları ekleyelim : 

```
  app.Run(async context =>
            {
                await context.Response.WriteAsync("Bu middleware den sonrasi calismayacak.");
            });
```
c.) Uygulamayı çalıştıralım : 

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

Görüldüğü üzere Run metodu kendisinden sonraki middleware çalıştırmıyor. 

d.) Run middleware'inin aşağısına bir tane daha Run middleware'i ekleyelim :


```
 app.Run(async context =>
            {
                await context.Response.WriteAsync("Bu middleware2 den sonrasi calismayacak.");
            });
```

Configure metodumuz şimdi şöyle gözükmelidir : 

```
 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.Run(async context =>
            {
                await context.Response.WriteAsync("Bu middleware den sonrasi calismayacak.");
            });

            app.Run(async context =>
            {
                await context.Response.WriteAsync("Bu middleware2 den sonrasi calismayacak.");
            });

            app.UseRouting();

            app.UseAuthorization();

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

```

e.) Uygulamayı çalıştıralım : 

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

Gördüğünüz üzere ikinci Run middleware'i çalışmadı çünkü:  Birinci Run middleware'i kısa devre(short circuit) yapıp pipeline akışını kesti.

### 2.) Use Middleware'i : 

* Use Middleware'i kendinden sonra gelen middleware çağırabilir, ve pipeline geriye döndüğünde next(); metodundan sonra yine farklı kodlar çalıştırabilir.

Örnek : 

a.) Configure metodumuzu aşağıdaki gibi değiştirelim

```
 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            
            app.Use(async (context, next) =>
            {
                await context.Response.WriteAsync(Environment.NewLine+"Bu middleware Use middleware'idir pipelini going" + Environment.NewLine);
                await next();
                await context.Response.WriteAsync(Environment.NewLine + "Bu middleware Use middleware'idir pipelini incoming/n" + Environment.NewLine);


            });
            app.Run(async context =>
            {
                await context.Response.WriteAsync("Bu Run middleware den sonraski middleware calismayacak. Ve geriye donuyor..");
            });

            app.Run(async context =>
            {
                await context.Response.WriteAsync("Bu middleware2 den sonrasi calismayacak.");
            });

```
b.) Uygulamayı çalıştıralım : 

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

Gördüğünüz üzere ilkbaşta app.Use ile ekrana 
await next();
öncesindeki response değerini yazdırdık. Daha sonra :
await next();
diyerek bir sonraki middleware olan Run middleware'ini çalıştırdık.
Run middleware'de response yazı yazdırdı ve kısa devre yaptı ikinci olan Run metoduna düşmedi.
Kısa devre yaptıktan sonra akış geriye doğru akmaya başladı ve Use middleware'in 
await next();
metodundan sonraki response ile dilediğimiz yazıyı yazdırdık.

Not : Anlayacağınız üzere akış aşağıdaki gibi ilk middleware'den başlar ve sonra tekrar geriye doğru giderek yine ilk middleware ile son bulur : 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5v649fnw6qaqpedi67by.png)
 
Bir dahaki yazımda Map ve MapWhen middleware'lerini inceleyeceğiz.

En iyi dileklerim ile.

Mustafa Samed Yeyin.