Api控制器声明多个Get语句

时间:2012-04-12 09:45:13

标签: c# asp.net-mvc-4 asp.net-web-api asp.net-routing

在MVC4中使用新的Api控制器,我发现了一个问题。如果我有以下方法:

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

这会奏效。但是,如果我想要检索不同类型的某些不同数据,则默认为GetAll方法,即使$.getJSON设置为GetAllIntegers方法:

public IEnumberable<int> GetAllIntergers()

(错误的命名约定)

我能够做到这一点吗?

我可以在Web API控制器中只有一个GetAll方法吗?

我认为想象一下我想要实现的目标更容易。以下是一段代码,用于显示我希望能够在单个ApiController中执行的操作:

public IEnumerable<string> GetClients()
{ // Get data
}

public IEnumerable<string> GetClient(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMember(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMembers()
{ // Get data
}

2 个答案:

答案 0 :(得分:63)

这就是路由中的全部内容。默认Web API路由如下所示:

config.Routes.MapHttpRoute( 
    name: "API Default", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
);

使用默认路由模板,Web API使用HTTP方法选择操作。结果它会将没有参数的GET请求映射到它可以找到的第一个GetAll。要解决此问题,您需要定义包含操作名称的路径:

config.Routes.MapHttpRoute( 
   name: "ActionApi", 
   routeTemplate: "api/{controller}/{action}/{id}", 
   defaults: new { id = RouteParameter.Optional } 
);

之后,您可以通过以下网址明星发出请求:

  • API / yourapicontroller / GetClients
  • API / yourapicontroller / GetStaffMembers

这样,您可以在Controller中拥有多个GetAll

另一个重要的事情是,使用这种路由方式,您必须使用属性来指定允许的HTTP方法(如[HttpGet])。

还可以选择将基于默认Web API动词的路由与传统方法混合使用,这里有很好的描述:

答案 1 :(得分:9)

如果其他人遇到此问题。这就是我解决这个问题的方法。使用控制器上的[Route]属性路由到特定URL。

[Route("api/getClient")]
public ClientViewModel GetClient(int id)

[Route("api/getAllClients")]
public IEnumerable<ClientViewModel> GetClients()