Asp.net Routing
Bir önceki dersimizde asp.net 6 ile yeni bir projeyi nasıl oluşturacağımızı öğrendik. Şimdi ise en basitiyle asp.net 6 ile hazırlanmış bir uygulamaya gelen bir talebi nasıl ele alırız, öğrenelim.
Yeni bir empty asp.net 6 projesi oluşturduğumuzda uygulamamıza gelen isteklerin nasıl karşılanacağı ayarlanmamış durumdadır. Bir uygulamaya gelen isteklerin karşılanma yöntemleri değişebilir. Örneğin; MVC, Razor Pages ya da Web Api projesi oluşturduğumuzda farklı yöntemler kullanmamız gerekir. Ancak temelde bu konulara hiç girmeden asp.net projesine gelen bir talebi ara yazılım yani middleware ile karşılayabiliriz.
Bir web uygulamasındaki süreç uygulamaya gelen bir istek (Http Request) ile başlar ve server' dan döndürülecek olan bir cevap (Http Response) nesnesinin oluşturulmasıyla son bulur. Bu süreç yani pipeline içerisine istediğimiz ara yazılımı ekleyebiliriz. Hatta gelen isteklerin hangi kaynak talebi olduğunu da kontrol edebiliriz ve bunun sonucunda ise bu kaynak taleplerini doğru yerlere yönlendirebiliriz. (Url Routing)
Uygulamaya gelen her talebi Program.cs dosyasına ekleyeceğimiz bir middlewere aracılığıyla karşılayabiliriz. Bir middleware' i Run() ve Use() metotları aracılığıyla ele alabiliriz.
Örnek:
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.Run(async context => { await context.Response.WriteAsync("Hello world!"); }); app.Run();
Run() metodu ile bir cevap üretmeliyiz. Bu cevap uygulama çalıştığında sayfa üzerine yazdırılacak olan "Hello World" yazısıdır. Tabi ki şu aşamada basit bir text bilgisini yazdırıyoruz ancak ilerleyen aşamada bir html sayfasını HttpResponse ile geri gönderiyor olmamız gerekiyor.
Burada dikkat etmemiz gereken uygulamaya her gelen isteğe hep aynı cevap döndürülür.
Örneğin;
http://localhost:5041 => Hello world!
http://localhost:5041/products => Hello world!
Ancak kullanıcılar uygulamadan farklı kaynak talebinde bulunmak ister örneğin /home ile /products farklı içerikler getiriyor olması gerekir.
Örnek:
app.Run(async context => { if (context.Request.Path == "/") { await context.Response.WriteAsync("Hello world!"); } if (context.Request.Path == "/home") { await context.Response.WriteAsync("Home"); } if (context.Request.Path == "/products") { await context.Response.WriteAsync("Products"); } });
Bu durumda uygulamaya gelen 3 farklı talep türünü ele almış oluruz. Ancak bu url' den başka bir değer girersek bir Response üretememiş oluruz.
http://localhost:5041 => Hello world!
http://localhost:5041/home => Home
http://localhost:5041/products => Products
Peki bu url şemalarından başka bir isteği nasıl karşılarız ? Örneğin en aşağıda bir else bloğu içerinde bu taleplerden başka her hangi bir talep için her zaman ekrana 404 page yazısını yaz diyebiliriz.
Örnek:
app.Run(async context => { if (context.Request.Path == "/") { await context.Response.WriteAsync("Hello world!"); } else if (context.Request.Path == "/home") { await context.Response.WriteAsync("Home"); } else if (context.Request.Path == "/products") { await context.Response.WriteAsync("Products"); } else { await context.Response.WriteAsync("404 page"); } });
Peki bu aşamaya kadar middleware aracılığıyla gelen talepleri nasıl yönlendireceğimizi anladık ancak tabi ki bir asp.net uygulamasında her istek için bir middleware eklemek zorunda değiliz. Bazı routing metotlarına sahibiz.
Örneğin uygulamaya gelen HttpGet talebini aşağıdaki şekilde karşılayabiliriz.
var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/", () => "Home"); app.MapGet("/products", () => "products"); app.MapGet("/products/{id}", (int id) => $"product id: {id}"); app.Run();
Bir sonraki dersimizde ise projemize bir controller ekleyerek gelen talepleri controller aracılığıyla nasıl ele alacağız, öğrenelim.