C# 如何在web API中调用接受相同参数类型的GET方法

C# 如何在web API中调用接受相同参数类型的GET方法,c#,.net,asp.net-web-api,C#,.net,Asp.net Web Api,我有一个名为Issues的模型,它具有Id和severity属性,这些属性是整数,还有一个issuecontroller,它应该处理GET请求并按严重性返回所有问题。既然dotnetapi不支持相同的参数类型,比如int,我该怎么做呢 我尝试使用不同的方法名称,例如Get()和GetBySeverity(int severity),但出现了不明确的异常 这是我的控制器 [路由(“api/[控制器]”)] [ApiController] 公共类问题控制器:ControllerBase { [

我有一个名为Issues的模型,它具有Id和severity属性,这些属性是整数,还有一个issuecontroller,它应该处理GET请求并按严重性返回所有问题。既然dotnetapi不支持相同的参数类型,比如int,我该怎么做呢

我尝试使用不同的方法名称,例如
Get()
GetBySeverity(int severity)
,但出现了不明确的异常

这是我的控制器

[路由(“api/[控制器]”)]
[ApiController]
公共类问题控制器:ControllerBase
{   
[HttpGet(Name=“issues”)]
公共IEnumerable GetAllIssues(){
IssueService服务=新的IssueService();
return service.GetIssues();
}
[HttpGet]
公共IEnumerable GetBySeverity([FromQuery(Name=“severity”)]int severity)
{
IssueService服务=新的IssueService();
返回服务。GetIssuseBySeverity(严重性);
}
}
这些是我想要开发的API
/api/issues/


/api/issues/?severity=1

像这样

//GET api/issues/5
[HttpGet("{id}")]
public Issue GetByRoute([FromRoute(Name="id")] int id)
{
    IssueService service = new IssueService();
    return service.GetIssueById(id);
}   


[HttpGet()]
public Issue GetByQuery([FromQuery(Name="severity")] int severityId)
{
   IssueService service = new IssueService();
   return service.GetIssueById(severityId);
}   

这是一个不明确的引用,因为这两个操作都是
HttpGet
,路由引擎无法决定要采用哪条路由或您指的是哪条路由

Web Api控制器使用HttpVerbs而不是操作/方法名称(如MVC)进行路由

我会用。这使用
路由(“myroute”)
来定义路由

// GET api/issues/severity/5
[Route("severity/{severity}")]
[HttpGet()]
public IEnumerable<Issue> GetBySeverity(int severity)
{
    IssueService service = new IssueService();
    return service.GetIssuesBySeverity(severity);
}

// GET api/issues/5
[HttpGet("{id}")]
public Issue Get(int id)
{
    IssueService service = new IssueService();
    return service.GetIssueById(id);
}   

以上操作将转到
api/issues?id=1
api/issues/severity?severity=1

查看Get方法上方的注释尝试以这种方式调用它。我已经更新了问题,您可以看一看,问题在于GetAllIssues和GetBySeverity,即使我添加了名称标记,问题仍然存在。我认为这是因为它们有相同的返回类型。控制器不知道使用哪个操作。您需要指定不同的路由。为什么不使用
api/issue/severity/1
按严重性获取问题?如果要执行此操作,请在操作上方添加
Route(“severity/{severity}”)
。name参数不会做任何事情,
[Route()]
是您想要使用的。否则,将您的方法重构为一个,您可能需要额外的参数来实现这一点@耐多药
// GET api/issues/severity?severity=5
[HttpGet("severity")]
public IEnumerable<Issue> GetBySeverity([FromQuery] int severity)
{
    IssueService service = new IssueService();
    return service.GetIssuesBySeverity(severity);
}

// GET api/issues?id=5
[HttpGet()]
public Issue Get([FromQuery] int id)
{
    IssueService service = new IssueService();
    return service.GetIssueById(id);
}