Örnek Bir Request - Response Yapısı
Yani hikayemiz giriş ve sonuçtan oluşuyorken buna ekstra olarak gelişme bölümü eklemiş olacağız. Ve böylece hikayemiz giriş-gelişme-sonuç bölümlerinden oluşmuş olacaktır. Öncelik olarak bir tane .Net Core projesi oluşturalım.
Benim çalışma dizinim şu şekilde: "D:\calisma-masasi\dotnetcore\ornekler" şimdi bu dizine CMD (Komut satırı) ile gidip .Net Core MVC projesi oluşturalım.
AspNetCoreMiddleware Projesini Oluşturalım
dotnet new mvc --name=AspNetCoreMiddleware
Proje oluşturmak için CMD ekranında bu satırları yazdık, kısa bir süre sonra projemiz oluşmuş olacaktır.
AspNetCoreMiddleware Projesini Oluşturalım
Komut satırından AspNetCoreMiddleware projemizi oluşturduk. Projeye ait ekran görüntüsünü paylaşalım.
AspNetCoreMiddleware Proje Gösterimi
Çalışma alanımız oluştu. Visual Studio Code ile çalışma alanımızdan devam etmek için CMD üzerinden
"D:\calisma-masasi\dotnetcore\ornekler\AspNetCoreMiddleware" dizinine gidip CMD ekranında
Projeyi VS Code ile Açalım
code .şeklinde yazıp VS Code ekranından projemize devam edelim.
Projemiz açıldı. Şimdi burada yapmamız gereken bir tane class oluşturmak. Ardından bu class'ın constructor (yapıcı) metodunda HttpContext'i enjekte (inject) ederek class içerisinde başlangıçtan itibaren HttpContext değerlerinin gelmesini sağlamış olacağız.
Loglama için Gereken RequestDelegate
using System; using System.IO; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; namespace AspNetCoreMiddleware { public class LoglamaIslemiMiddleware { private readonly RequestDelegate _rdIstek; public LoglamaIslemiMiddleware(RequestDelegate rdIstek) { _rdIstek = rdIstek; } public async Task Invoke(HttpContext httpContext) { string strIp = httpContext.Connection.RemoteIpAddress.ToString(); string strTarayiciBilgileri = httpContext.Request.Headers["User-Agent"]; string strRequestScheme = httpContext.Request.Scheme; string strRequestHost = httpContext.Request.Host.ToString(); string strRequestPath = httpContext.Request.Path; string strRequestQueryString = httpContext.Request.QueryString.ToString(); string strPatika = "D:/calisma-masasi/dotnetcore/ornekler/AspNetCoreMiddleware/log.txt"; using (StreamWriter swYazici = System.IO.File.AppendText(strPatika)) { swYazici.WriteLine("#### Request (BASLANGIC) ####"); swYazici.WriteLine("Ip Adresi: " + strIp); swYazici.WriteLine("Tarayıcı Bilgileri: " + strTarayiciBilgileri); swYazici.WriteLine("Request.Scheme: " + strRequestScheme); swYazici.WriteLine("Request.Host: " + strRequestHost); swYazici.WriteLine("Request.Path: " + strRequestPath); swYazici.WriteLine("Request.QueryString: " + strRequestQueryString); swYazici.WriteLine("Tarih: " + DateTime.Now); swYazici.WriteLine("#### Request (BITIS) ####"); swYazici.WriteLine("\n"); } await _rdIstek.Invoke(httpContext); } } }
Hazırlamış olduğumuz LoglamaIslemiMiddleware classı için AraKatmanExtension adlı extension sınıf hazırlayalım.
AraKatmanExtension
using Microsoft.AspNetCore.Builder; namespace AspNetCoreMiddleware { public static class AraKatmanExtension { public static IApplicationBuilder AraKatmanlar(this IApplicationBuilder builder) { return builder.UseMiddleware<LoglamaIslemiMiddleware>(); } } }
.Net Core ile birlikte gelen Startup.cs içerisinde yazmış olduğumuz bu AraKatmanlar adlı static metodu register ederek Request ile Response arasına girerek istediğimiz işlemleri gerçekleştirmiş olacağız.
Startup.cs İçerisinde Metodumuzu Register Edelim
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { //.... Diğer register edilmesi gerekenler. app.AraKatmanlar(); }
Projemizi çalıştıralım.
Projemizin Çalışması
Projemiz çalıştı. Sayfalar arası geçiş yapıp log.txt dosyasına verilerin yazılmasını sağladıktan sonra log.txt dosyasını açıp yazılan bilgileri kontrol edelim.
Logları Kontrol Edelim
Sayfa yüklenmeye başladığı an itibariyle ziyaretçiye gönderilecek her şeyi görebilmekteyiz. "CSS, JavaScript vb.." gibi dosyalar.
Middleware'ın avantajlarını kapanış olarak vermek gerekirse:
- Loglama için her ActionResult'a girip tek tek kod yazmaya gerek kalmaz.
- Hata yönetimi için basit düzeyde tek yerden yönetilebilirlik.
- Kısıtlama işlemi.
- Sayfa bazlı özel gösterimler vb..
Bu örnekler daha da arttırılabilir. Kısa bir şekilde işin mantığını sizlere aktarmaya çalıştık.
Middleware projesini Github üzerinden indirmek için tıklayınız.