Как да създадете ограничения на маршрута в ASP.NET Core

Ограниченията на маршрута в ASP.NET Core се използват за филтриране или ограничаване на нежеланите данни да достигат до действията на вашия контролер. За буквар за маршрутизиране в ASP.NET Core можете да се обърнете към предишната ми статия за базирана на атрибути маршрутизация спрямо маршрутизация, базирана на конвенции в ASP.NET Core. Тази статия надхвърля основите, за да изследва усъвършенстваните операции, използвайки ограничения на маршрута.

За да работите с примерите за кодове, предоставени в тази статия, трябва да имате Visual Studio 2019 инсталиран във вашата система. Ако все още нямате копие, можете да изтеглите Visual Studio 2019 тук. 

Създайте ASP.NET Core MVC проект в Visual Studio 2019

Първо, нека създадем проект ASP.Net Core в Visual Studio 2019. Ако приемем, че Visual Studio 2019 е инсталиран във вашата система, следвайте стъпките, описани по-долу, за да създадете нов проект ASP.Net Core в Visual Studio.

  1. Стартирайте Visual Studio IDE.
  2. Кликнете върху „Създаване на нов проект“.
  3. В прозореца „Създаване на нов проект“ изберете „ASP.NET Core Web Application“ от показания списък с шаблони.
  4. Щракнете върху Напред.
  5. В прозореца „Конфигуриране на вашия нов проект“ посочете името и местоположението на новия проект.
  6. По избор поставете отметка в квадратчето „Поставяне на решение и проект в една и съща директория“, в зависимост от вашите предпочитания.
  7. Щракнете върху Създаване.
  8. В прозореца „Създаване на ново уеб приложение на ASP.NET Core“, показан по-нататък, изберете .NET Core като време на изпълнение и ASP.NET Core 3.1 (или по-нова версия) от падащия списък в горната част.
  9. Изберете „Уеб приложение (Model-View-Controller)“ като шаблон на проекта, за да създадете ново приложение на ASP.NET Core MVC. 
  10. Уверете се, че квадратчетата „Активиране на поддръжката на Docker“ и „Конфигуриране за HTTPS“ са отметнати, тъй като тук няма да използваме тези функции.
  11. Уверете се, че удостоверяването е настроено на „Без удостоверяване“, тъй като и ние няма да използваме удостоверяване.
  12. Щракнете върху Създаване.

Следвайки тези стъпки, ще създадете нов ASP.NET Core MVC проект в Visual Studio 2019. Ще използваме този проект в секциите по-долу, за да илюстрираме как можем да използваме ограничения на маршрута в ASP.NET Core 3.1.

Класът RouteCollection в ASP.NET Core

Класът RouteTable в ASP.NET Core съдържа свойство с име Routes, което съхранява всички маршрути като RouteCollection. Класът RouteCollection съдържа някои методи за разширение, които могат да се използват за картографиране на маршрути или да ги игнорират.

MapRoute е претоварен метод, който приема ограничения като параметър. Можете да използвате това, за да предадете ограничението си по маршрута. Следва декларацията на метода MapRoute.

обществен статичен Route MapRoute (този RouteCollection маршрути, име на низ,

    низ за url, обект по подразбиране, обектни ограничения);

Интерфейсът IRouteConstraint в ASP.NET Core

Интерфейсът IRouteConstraint е договор, който съдържа декларацията само на един метод с име Match. Този интерфейс трябва да бъде разширен от клас и методът Match, внедрен в него, за да се провери дали определен параметър на URL е валиден за ограничение. Ето как се определя интерфейсът IRouteConstraint:

пространство от имена Microsoft.AspNetCore.Routing

{

    публичен интерфейс IRouteConstraint

    {

        bool Match (

            HttpContext httpContext,

            Вътрешен маршрут,

            низ routeKey,

            Стойности на RouteValueDictionary,

            RouteDirection routeDirection);

    }

}

Речникът ConstraintMap в ASP.NET Core

ConstraintMap е речник, който съдържа списък с ограничения на маршрута, който съпоставя ключовете за ограничение на маршрута с реализациите на IRouteConstraint. Кодовият фрагмент, даден по-долу, илюстрира как можете да добавите персонализирани ограничения към този речник.

публична невалидна ConfigureServices (услуги на IServiceCollection) 

{  

  services.Configure (routeOptions =>  

  { 

     routeOptions.ConstraintMap.Add ("emailconstraint", typeof (EmailRouteContraint)); 

  }); 

Внедрете метода IRouteConstraint Match в ASP.NET Core

За да създадете персонализирано ограничение на маршрута, трябва да създадете клас, който разширява интерфейса IRouteConstraint и прилага неговия метод Match. Ограничението може да се използва за предотвратяване на нежелани входящи заявки и предотвратяване на съвпадение на маршрут, освен ако не е изпълнено определено условие. Например може да искате да се уверите, че параметърът, предаден на метод за действие, винаги е цяло число.

Методът Match съответства на следните параметри:

  • HttpContext - капсулира цялата HTTP специфична информация за дадена заявка
  • IRouter - представлява рутера, който ще приложи ограниченията
  • RouteKey - представлява параметъра на маршрута, който се проверява
  • RouteDirection - изброяване, което съдържа две стойности, а именно IncomingRequest и UrlGeneration, и се използва за посочване дали URL адресът се обработва от HTTP заявката или генерира URL адрес
  • RouteValues ​​- съдържа параметрите на URL

Структура на персонализирано ограничение на маршрута в ASP.NET Core

Ето пример за структурата на персонализирано ограничение на маршрута:

публичен клас CustomRouteConstraint: IRouteConstraint

    {

        публичен bool Match (HttpContext httpContext, IRouter route,

        низ routeKey, RouteValueDictionary стойности,

        RouteDirection routeDirection)

        {

            хвърли нов NotImplementedException ();

        }

    }

Пример за ограничение на персонализиран маршрут в ASP.NET Core

Нека сега внедрим персонализирано ограничение на маршрута, което може да провери за имейл идентификатори. Първо, създайте клас, който разширява интерфейса IRouteConstraint и прилага метода Match. Следният кодов фрагмент показва персонализиран клас ограничение на маршрута, наречен EmailRouteContraint, който разширява интерфейса IRouteConstraint.

публичен клас EmailRouteContraint: IRouteConstraint

    {

        публичен bool Match (HttpContext httpContext, IRouter route,

        низ routeKey, RouteValueDictionary стойности,

        RouteDirection routeDirection)

        {

            връщане вярно;

        }

    }

Следният списък с кодове показва класа EmailRouteConstraint с внедрен метод Match.

публичен клас EmailRouteContraint: IRouteConstraint

    {

        публичен bool Match (HttpContext httpContext, IRouter route,

        низ routeKey, RouteValueDictionary стойности,

        RouteDirection routeDirection)

        {

            if (values.TryGetValue (routeKey, out var routeValue))

            {

                var parameterValueString = Convert.ToString (routeValue,

                CultureInfo.InvariantCulture);

                върнете IsEmailAddressValid (parameterValueString);

            }

            върнете false;

        }

        private bool IsEmailAddressValid (низ emailAddress)

        {

            връщане вярно;

        }

    }

Забележете, че методът IsEmailAddressValid тук просто връща „true“. Оставям на вас да напишете необходимия код за валидиране на имейл адреса.

Регистрирайте персонализирано ограничение на маршрута в ASP.NET Core

Трябва да регистрирате вашето персонализирано ограничение на маршрута със системата за маршрутизиране в метода ConfigureServices на класа Startup. Следният кодов фрагмент илюстрира това. 

публична невалидна ConfigureServices (услуги на IServiceCollection)

      {

          services.AddControllersWithViews ();

          services.Configure (routeOptions =>

          {

              routeOptions.ConstraintMap.Add ("ERC",

              typeof (EmailRouteContraint));

          });

      }

Трябва също да конфигурирате вашето ограничение по избор в метода за конфигуриране на стартовия клас, както е показано в кодовия фрагмент по-долу.

app.UseEndpoints (крайни точки =>

{

     крайни точки.MapControllerRoute (

         име: "по подразбиране",

         ограничения: new {ERC = new EmailRouteContraint ()},

         образец: "{controller = Home} / {action = Index} / {id?}");

});

И това е. Вече можете да посочите ограничението във вашия контролер или вашите методи за действие и да започнете да използвате приложението.

Времето за изпълнение на ASP.NET Core се проверява, ако дефинираните ограничения за модел и маршрут съвпадат с модела и стойностите на входящата заявка. Логиката на валидиране на ограничението е дефинирана в метода Match на вашето персонализирано ограничение на маршрута. Можете да се възползвате от ограниченията, за да избегнете ненужни заявки, както и да проверите стойностите на маршрута, преди заявката да бъде предадена на метод за действие.

Как да направите повече в ASP.NET Core:

  • Как да управлявате потребителските тайни в ASP.NET Core
  • Как да изграждам gRPC приложения в ASP.NET Core
  • Как да пренасочите заявка в ASP.NET Core
  • Как да използвам маршрутизиране на атрибути в ASP.NET Core
  • Как да предавам параметри на методи за действие в ASP.NET Core MVC
  • Как да използвам API анализатори в ASP.NET Core
  • Как да използваме маркери за данни за маршрути в ASP.NET Core
  • Как да използвам версирането на API в ASP.NET Core
  • Как да използвам обекти за прехвърляне на данни в ASP.NET Core 3.1
  • Как да се справя с 404 грешки в ASP.NET Core MVC
  • Как да използвам инжектиране на зависимост във филтри за действие в ASP.NET Core 3.1
  • Как да използвам шаблона за опции в ASP.NET Core
  • Как да използвам маршрутизиране на крайни точки в ASP.NET Core 3.0 MVC
  • Как да експортирам данни в Excel в ASP.NET Core 3.0
  • Как да използвам LoggerMessage в ASP.NET Core 3.0
  • Как да изпращате имейли в ASP.NET Core
  • Как да регистрирам данни в SQL Server в ASP.NET Core
  • Как да планирате работни места с помощта на Quartz.NET в ASP.NET Core
  • Как да върнете данни от ASP.NET Core Web API
  • Как да форматирате данните за отговор в ASP.NET Core
  • Как да консумирате ASP.NET Core Web API с помощта на RestSharp
  • Как да извършвате асинхронни операции с помощта на Dapper
  • Как да използваме флагове на функции в ASP.NET Core
  • Как да използвам атрибута FromServices в ASP.NET Core
  • Как да работите с бисквитки в ASP.NET Core
  • Как да работя със статични файлове в ASP.NET Core
  • Как да използвам URL пренаписване на Middleware в ASP.NET Core
  • Как да приложим ограничаване на скоростта в ASP.NET Core
  • Как да използвам Azure Application Insights в ASP.NET Core
  • Използване на разширени функции на NLog в ASP.NET Core
  • Как да се справим с грешки в ASP.NET Web API
  • Как да приложим обработка на глобални изключения в ASP.NET Core MVC
  • Как да се справя с нулеви стойности в ASP.NET Core MVC
  • Разширено създаване на версии в ASP.NET Core Web API
  • Как да работя с услуги за работници в ASP.NET Core
  • Как да използвам API за защита на данните в ASP.NET Core
  • Как да използвам условен мидълуер в ASP.NET Core
  • Как да работите със състоянието на сесията в ASP.NET Core
  • Как да пишете ефективни контролери в ASP.NET Core