ما هي Endpoint Routing وكيفية تنفيذها
-
يقدم ASP.NET Core مفهومً جديدًا هو Endpoint routing والذي يوفر معلومات التوجيه إلى middlewares في Startup.cs class. لم تكن هذه الميزة موجودة في ASP.NET Core 2.0 والإصدارات السابقة.وحتي نفهم الموضوع انظر الكود أدناه الذي يحاول معرفة اسم Controller’s ، في Configure method لملف Startup.cs.
app.Use(async (context, next) =>
{
var controller = context.Request.RouteValues["controller"];
await next();
});
بنحاول في هذا السيناريو، الحصول على قيمة controller variable.
تمام وحتي هذا المفهوم ونفهمو خلونا نطبق الكود التالي :
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStaticFiles();
app.UseRouting();
app.Use(async (context, next) =>
{
var controller = context.Request.RouteValues["controller"];
await next();
});
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
الان شغل التطبيق وخلونا نضيف breakpoint وبعدها نشوف شو هي قيمة " controller ". لازم الان نحصل على قيمة controller. هذا كله بسبب Endpoint routing. تحقق من الصورة أدناه التي توضح قيمة نقطة التوقف:

تنفيذ Endpoint Routing
بشكل افتراضي، يتم اضافة وتفعيل Endpoint routing enabled في 6.0, ASP.NET 3.0, 5.0 والإصدارات الأحدث. فقط كل المطلوب إضافة الكود ()app.UseRouting في ()method Configure داخل ملف Startup.cs ،واكيد قبل أي middleware أخرى تحتاج إلى الوصول إلى routing:
شوف الكود التالي :
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//Define this before other middleware that needs routing access
app.UseRouting();
// Here add middlewares that needs routing access
app.UseEndpoints(endpoints =>
{
//Define endpoint routes here
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
تمام نفهم الكود :
في Endpoint routing’s لا بد من تطبيق two extension methods هما:
- UseRouting: يطابق الطلب ب endpoint.
- UseEndpoints: يقوم بتنفيذ endpoint المتطابقة.
تمثل endpoint عنوان URL للمسار الذي يتطابق مع الطلب.
الشيء الجديد هو أن routing منفصل عن ميزة ASP.NET. في الإصدارات السابقة، كان لكل ميزة (MVC ، Razor Pages ، SIgnalR ، إلخ) تنفيذ endpoint الخاصة بها. الآن يمكن إجراء endpoint and routing configuration بشكل مستقل.
يدعم Endpoint routing العديد من طرق route configuration ، ومن أهمها:
()MapControllerRoute
في هذا الطريقة يتم اضافة endpoints الى controller actions ثم يتم تحديد route مع إعطاء name, pattern constraints ... الخ.
وشكل هذه الطريقة يكون endpoint configuration على النحو التالي:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
()MapRazorPages
في هذا النوع يتم تعيين endpoint routing لصفحات Razor.
وشكل هذه الطريقة endpoint configuration على النحو التالي:
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
()MapRazorPages
في هذا النوع يتم إضافة route بحيث يتطابق فقط مع طلبات HTTP GET.
في الكود التالي بنعمل على اظهاره رسالة Hello في المتصفح:
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", context => context.Response.WriteAsync("Hello"));
});
وبالمثل، يمكننا تكوين مسار Http route آخر مثل MapPost و MapDelete و MapPut وما إلى ذلك.
تمام نفهم الان وين بستخدم Endpoint Routing
يعمل Endpoint routing على جعل ASP.NET Core framework أكثر مرونة نظرًا لأنه يفصل وظيفة route matching و resolution functionality من endpoint dispatching functionality ، والتي كانت مجمعة حتى الآن مع MVC middleware.
سنأخذ بعض الأمثلة للتوضيح
CORS
لنفترض أنه يتعين عليك تمكين CORS على single endpoint. يمكنك القيام بذلك ببساطة على النحو التالي:
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/YourUrl", context => context.Response.WriteAsync("Hello world")).RequireCors("policy-name");
});
للمزيد حول CORS الرجاء الدخول الى الرابط تمكين CORS في الموقع
ومن المزيات الرائعة ايضا ان بتقدر تعمل تمكين Authorization على endpoint واحدة بحيث يمكن إضافة أدوار مثل Admin” " الذي سيكون في هذه الحالة هو فقط المخول لعرض عنوان URL المقابل مثل هذا:
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/secured",
context => context.Response.WriteAsync("Secured Page"))
.RequireAuthorization(new AuthorizeAttribute() { Roles = "admin" });
});
اعادة التوجيه في Redirection in ASP.NET Core
تعلمنا ان عندما يكون هناك أكثر من route في التطبيق، فسيتم تطبيق المسارات بالترتيب الذي تم تحديدها به.لكن شو لو كنا بحاجه في مكان ما الى تجاوز هذا الترتيب:
الامر بسيط لان يمكن تجاوز هذا الشيء لأن عندنا معلومات مسبقة حول الكثير من أشياء المسار.
وحتي نعرف كيف نعمل هاذ الاشي خلونا نجرب نطبق الكود التالي، حيث سنقوم بإعادة توجيه المستخدم إلى صفحة Login عندما يتم استدعاء Controller باسم Business و action باسم Deal.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//Define this before other middleware that needs routing access app.UseRouting();
// Redirect code
app.Use(async (context, next) =>
{
var controller = context.Request.RouteValues["controller"];
var action = context.Request.RouteValues["action"];
if ((controller.ToString() == "Business") && (action.ToString() == "Deal"))
{
context.Response.Redirect("/Login");
}
await next();
});
app.UseEndpoints(endpoints =>
{
//Define endpoint routes here
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
إذا كنت ترغب في الاستمرار في العمل مع المسارات القديمة في الاصدارات السابقه باستخدام ()app.UseMvc، فيمكنك تعطيل Endpoint routing في ConfigureServices() method كما هو موضح في الاسفل:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(option => option.EnableEndpointRouting = false); // disable endpoint routing
}
اترك تعليقك