zverx / how-use-enum-route-webapi

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

how-use-enum-route-webapi

  1. Проблема матчинга ендпойнтов

В проектах с большим количеством ендпойнтов можно столкнуться с проблемой матчинга (route matching):

The request matched multiple endpoints. Matches: ...
   at Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ReportAmbiguity(CandidateState[] candidateState)
   at Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ProcessFinalCandidates(HttpContext httpContext, CandidateState[] candidateState)
   at Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.Select(HttpContext httpContext, CandidateState[] candidateState)
   at Microsoft.AspNetCore.Routing.Matching.DfaMatcher.MatchAsync(HttpContext httpContext)
   at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.Invoke(HttpContext context)

Частично проблему матчинга можно решить с помощью ограничений маршрута (route constraints) по ссылке

В моем случае использовались enum в путях, поэтому решил добавить свое ограничение маршрута по enum.

  1. Создаем класс EnumConstraint, наследованный от Microsoft.AspNetCore.Routing.IRouteConstraint, реализацию можно посмотреть в солюшне.

  2. добавляем в метод ConfigureServices

builder.Services.AddRouting(options => options.ConstraintMap.Add("enum", typeof(EnumConstraint)));
  1. Указываем в пути атрибута HttpGet для контроллера, у которого параметром является enum
[HttpGet($"{{type:enum({nameof(ObjectTypeEnum)})}}")]
public ActionResult GetByType([FromRoute] ObjectTypeEnum type)
{
   ...
}

About

License:MIT License


Languages

Language:C# 100.0%