Несколько методов HTTPGET в ASP. NET CORE WEB-API - PullRequest
1 голос
/ 18 апреля 2020

Я начал экспериментировать с ASP. NET Базовым WEB API, и при написании контроллера для поддержки нескольких запросов на получение, различающихся по количеству параметров, я получаю следующую ошибку.

Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: запрос соответствует нескольким конечным точкам. Совпадения:

PaperRocket.Controllers.Products.ProductsController.GetProducts (PaperRocket) PaperRocket.Controllers.Products.ProductsController.GetProduct (PaperRocket) в Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSid_StateState в Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ProcessFinalCandidates (HttpContext httpContext, CandidateState [] candidState) в Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.Select (HttpContext.SecateTateStateStateTateGateTateState) StateContate .DfaMatcher.MatchAsyn c (HttpContext httpContext) в Microsoft.AspNetCore.Routing.Matching.DataSourceDependentMatcher.MatchAsyn c (HttpContext httpContext) в Microsoft.AspNetCore.Routing.EndpointRoutxtConteteteteteteText .DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext)

HEADERS ======= Принять: / Accept-Encoding: gzip, deflate, br Cache-Control: no-cache Соединение: keep-alive Хост: localhost: 54967 Пользователь-агент: PostmanRuntime / 7.24.1 Почтальон-токен: 0f3ce4b4-283a-472b-9350-7b0cc02d31ae

Итак, мой вопрос, можем ли мы иметь несколько методов get

  1. , которые отличаются количеством параметров (что возможно в WEB-API)
  2. Без использования HTTPGET ("RouteConstraint") - (я знаю, с этим это будет работать)
  3. соответствующий метод должен вызываться и идентифицироваться параметрами, которые мы передали

Ниже приведен мой код:

    [HttpGet]
    public IEnumerable<Product> GetProducts()
    {
        return _Productcontext.GetProducts();
    }

    [HttpGet]
    public Product GetProduct([FromQuery(Name = "ProductCode")]string ProductCode)
    {
        return _Productcontext.GetProductByProductCode(ProductCode);
    }

Наконец, пожалуйста, направьте меня на любую лучшую модель привязки, маршрутизации в основных статьях asp. net и чем они отличаются от ASP. NET WEB-API.

1 Ответ

0 голосов
/ 20 апреля 2020

Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: запрос соответствует нескольким конечным точкам.

Вы можете попытаться включить или отключить действие для данного запроса на основе строки запроса, которую вы передается путем реализации пользовательского ActionMethodSelectorAttribute , как показано ниже.

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class CheckProductCodeAttribute : ActionMethodSelectorAttribute
{
    public string QueryStingName { get; set; }
    public bool CanPass { get; set; }
    public CheckProductCodeAttribute(string qname, bool canpass)
    {
        QueryStingName = qname;
        CanPass = canpass;
    }

    public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
    {
        StringValues value;

        routeContext.HttpContext.Request.Query.TryGetValue(QueryStingName, out value);

        if (QueryStingName == "" && CanPass)
        {
            return true;
        }
        else
        {
            if (CanPass)
            {
                return !StringValues.IsNullOrEmpty(value);
            }

            return StringValues.IsNullOrEmpty(value);
        }
    }
}

Применить к вашим действиям

[HttpGet]
[CheckProductCode("", true)]
[CheckProductCode("ProductCode", false)]
public IEnumerable<Product> GetProducts()
{
    return _Productcontext.GetProducts();
}

[HttpGet]
[CheckProductCode("", false)]
[CheckProductCode("ProductCode", true)]
public Product GetProduct([FromQuery(Name = "ProductCode")]string ProductCode)
{
    return _Productcontext.GetProductByProductCode(ProductCode);
}
...