ASP.NET Core Web API - ограничения маршрутов для списков / массивов - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть простое действие ASP.NET Core 2.1 Web API, которое должно получить список направляющих.

Теперь я пытаюсь добавить правильное ограничение в маршрут, но не могу найти примердля списков.

Сейчас мое действие выглядит следующим образом, но это ограничение для одного значения.

[HttpGet("Info/{guids:guid}")]
public async Task<IActionResult> Get(Guid[] guids)
{
    return Ok();
}

Возможно ли добавить это ограничение или нет ограничения для этого доступногопрямо сейчас?

1 Ответ

0 голосов
/ 13 декабря 2018

У меня есть 2 варианта для вас.

Одним из вариантов будет использование регулярных выражений.[HttpGet("Info/{guids:regex((([{(]?[0-9A-F]{8}[-]?(?:[0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?)[\,]?)+)}")] но это совсем не красиво и сложно для чтения (мое регулярное выражение также нуждается в пересмотре, сделанном просто для того, чтобы подчеркнуть его).

Более понятный способ - реализовать пользовательское ограничение.

   public class GuidListConstraint : IRouteConstraint
{
    /// <inheritdoc />
    public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values,
        RouteDirection routeDirection)
    {
        var valueActuallySubmitted = values.TryGetValue(routeKey, out var value);

        if (!valueActuallySubmitted) return false;

        var guidListAsString = value.ToString();
        var splitOnComma = guidListAsString.Split(",", StringSplitOptions.RemoveEmptyEntries);

        foreach (var guidValue in splitOnComma)
        {
            var isProperGuid = Guid.TryParse(guidValue, out var _);
            if (!isProperGuid) return false;
        }

        return true;
    }
}

Который вы можете зарегистрировать после services.AddMvc() как

services.Configure<RouteOptions>(options => options.ConstraintMap.Add("myguidlist", typeof(GuidListConstraint)));

Затем вы можете украсить свои действия как [HttpGet("Info/{guids:myguidlist}")]

Не проверял это тщательно, нос небольшой настройкой это даст вам хороший старт.

...