مشاور و مدرس برنامه نویسی در حوزه دات نت - https://github.com/mjebrahimi
بررسی قابلیت Endpoint Routing در ASP.NET Core
نحوه کار مکانیزم مسیریابی به این صورت است که ما Route هایمان را مثلا درون میانافزار MVC (توسط متد UseMvc) تعریف میکنیم و زمانیکه یک درخواست به میانافزار MVC میرسد، این میانافزار بر اساس اطلاعات Url و Routeهای تعریف شده، اولین Route ایی را که همخوانی داشته باشد، انتخاب کرده و مقادیر مسیر یابی (RouteValues) را استخراج میکند و بدین ترتیب میفهمد که کدام Controller و Action باید فراخوانی شود.
در Pipeline چون میانافزارها به صورت ترتیبی اجرا میشوند، تا زمانیکه درخواست ما به میانافزار MVC (منظور جایی است که Routeها تعریف شدهاند؛ ولی برای درک بهتر با میانافزار MVC مثال میزنیم) نمیتوانیم از RouteValues استفاده کنیم.مشکل جایی پیش میآید که مثلا برای وبسایتهای چند زبانه که بر اساس Url کار میکنند (مثلا fa/home/index) نیاز داریم قبل از رسیدن به میانافزار MVC، زبان جاری (همان fa) را توسط سیستم مسیریابی بخوانیم و Culture برنامه را تغییر بدهیم ولی تا زمانیکه به میانافزار MVC نرسیم این کار امکان پذیر نیست.
یک مثال دیگر آن، استفاده از ویژگی EnableCorsAttribute (است که بر خلاف UseCors که مکانیزم CORS را به صورت سراسری اعمال میکند) میتوان آن را بر روی یک Action خاص اعمال کرد.از آنجایی که در مکانیزم مسیریابی قبلی، سیستم Routing بسیار وابسته به MVC است، ما نمیتوانیم قبل از رسیدن به میانافزار MVC، جلوی درخواستهای غیر مجاز را بگیریم، چرا که به Routing درسترسی نداریم و نمیدانیم کدام Controller و Action قرار است فراخوانی بشود.
اما در مکانیزم Endpoint Routing، وقتی یک درخواست میآید، همان ابتدا مشخص میشود که به کدام Route نگاشت شده؛ درنتیجه بقیهی میانافزارهای قبل از MVC هم میتوانند از سیستم Routing استفاده کرده و اطلاعات داخل Url را درک کنند.
این قابلیت در ASP Core 2.2، اوایل با نام Dispatcher معرفی شد که بعدا به Endpoint Routing تغییر نام پیدا کرد و به صورت پیشفرض توسط SetCompatibilityVersion ورژن Version_2_2 به بالا فعال میشود.برای استفاده از Endpoint Routing باید میانافزار مربوطه را توسط متد UseEndpointRouting اضافه کنیم. کار این میانافزار تشخیص Endpoint مورد نظر براساس Url درخواستی و Routeهای تعریف شده است و پس از آن میتوانیم از مقادیر مسیریابی (RouteValues) استفاده کنیم (حتی قبل از رسیدن به محل تعریف Route ها).
// ASP.NET Core 2.2
public void Configure(IApplicationBuilder app)
{
app.UseEndpointRouting();
app.OtherMiddleware(); // Access to route values
app.UseMvc();
}
نکته : در ASPNET Core 3.0 متد UseEndpointRouting به UseRouting تغییر نام پیدا کرد و نیز تعریف Route (بهتر است بگوییم Endpoint ها) به شکل زیر تغییر پیدا کرده است.
// ASP.NET Core 3.0
public void Configure(IApplicationBuilder app)
{
app.UseRouting();
app.OtherMiddleware();
app.UseEndpoints(endpoints =>
{
// Mapping of endpoints goes here:
endpoints.MapControllers()
endpoints.MapRazorPages()
endpoints.MapHub<MyChatHub>()
endpoints.MapGrpcService<MyCalculatorService>()
});
}
برای غیر فعال کردن قابلیت Endpoint Routing میتوانید توسط MvcOptions.EnableEndpointRouting = false آن را غیرفعال کنید.
منابع و اطلاعات بیشتر:
- https://www.stevejgordon.co.uk/asp-net-core-first-look-at-global-routing-dispatcher
- https://rolandguijt.com/endpoint-routing-in-asp-net-core-2-2-explained/
- https://rimdev.io/asp-net-core-routes-middleware/
- https://devblogs.microsoft.com/aspnet/asp-net-core-2-2-0-preview1-endpoint-routing/
_________________________
مطلبی دیگر از این انتشارات
اشتباهات رایج در استفاده از Async/Await + راه حل
مطلبی دیگر از این انتشارات
آموزش Microservices در ASP.NET Core (سری دوم)
مطلبی دیگر از این انتشارات
آموزش Cache در Asp.Net Core (قسمت دوم : EasyCaching)