一个控制器可以多次获取吗?

问题描述 投票:0回答:1

我正在使用 ASP.NET Web API。有一个用户控制器具有以下两种方法。

[HttpGet("{firstName}")]
public List<string> GetByFirstNameContains(string firstName)
{
    return new List<string>()
    {
        "F1", "F2", "F3"
    };
}
    
[HttpGet("{lastName}")]
public List<string> GetByLastNameContains(string lastName)
{
    return new List<string>()
    {
        "L1", "L2", "L3"
    };
}

产生以下错误:

Microsoft.AspNetCore.Routing.Matching.AmbigouslyMatchException:请求匹配多个终结点。比赛:

GettingStartedAPI.Controllers.UsersController.GetByFirstNameContains(GettingStartedAPI) GettingStartedAPI.Controllers.UsersController.Get (GettingStartedAPI) GettingStartedAPI.Controllers.UsersController.GetByLastNameContains (GettingStartedAPI) 在 Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ReportAmbiguity(Span

1 candidateState) at Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ProcessFinalCandidates(HttpContext httpContext, Span
1候选状态) 在 Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.Select(HttpContext httpContext,Span`1候选状态) 在 Microsoft.AspNetCore.Routing.Matching.DfaMatcher.MatchAsync(HttpContext httpContext) 在 Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext 上下文)

有没有办法在同一个控制器中拥有多个方法来按不同字段进行搜索?

这也失败了:

[HttpGet("{id}")]
public string Get(int id)
{
    return "value";
}

[HttpGet("{lastName}")]
public List<string> ArgleBargle(string lastName)
{
    return new List<string>()
    {
        "L1", "L2", "L3"
    };
}

Microsoft.AspNetCore.Routing.Matching.AmbigouslyMatchException:请求匹配多个终结点。比赛:

GettingStartedAPI.Controllers.UsersController.Get(GettingStartedAPI) GettingStartedAPI.Controllers.UsersController.ArgleBargle (入门API)

我构建了下面这个可怕的怪物,这是可行的。显然,必须有更好的方法。任何帮助将不胜感激。

[HttpGet("{field},{value}")]
public dynamic Get(UserNameFields field, string value)
{
    if (field == UserNameFields.FirstName)
    {
        return new List<string>()
        {
            "F1", "F2", "F3"
        };
    }
    else if (field == UserNameFields.ID)
    {
        return "value";
    }
    else
    {
        return new List<string>()
        {
            "L1", "L2", "L3"
        };
    }
}
asp.net-web-api
1个回答
0
投票

您收到 Asp.Net Core AmbigouslyMatchException 异常,因为您为两个函数定义的路由模式使用相同的路由模式 [HttpGet("{parameter}")],当您发送请求时,它将无法确定哪个方法打电话。我建议你区分路线。对于方法“GetByFirstNameContains”,您可以使用 [HttpGet("userbyfirstname/{firstName}")] 和 [HttpGet("userbylastname/{lastName}")] 作为第二种方法。

我希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.