Api控制器声明多个Get语句

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

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

这将工作。 但是,如果我想要检索一些不同types的不同数据,即使将$.getJSON设置为GetAllIntegers方法,它也将默认为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 } 

这一切都在路由。 默认的Web API路线如下所示:

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

使用默认的路由模板,Web API使用HTTP方法来select操作。 结果它会将没有参数的GET请求映射到它可以find的第一个GetAll 。 为了解决这个问题,你需要定义一个path,其中包含操作名称:

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

之后,您可以使用以下url发送请求:

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

这样你可以有多个GetAll in Controller。

此处更重要的一点是,使用这种路由方式时,必须使用属性来指定允许的HTTP方法(如[HttpGet])。

还有一个select是将基于默认Web API动词的路由与传统方法混合使用,这里有很好的描述:

  • Web API:混合传统和基于动词的路由

万一别人面临这个问题。 这是我如何解决这个问题。 使用控制器上的[Route]属性路由到特定的URL。

 [Route("api/getClient")] public ClientViewModel GetClient(int id) [Route("api/getAllClients")] public IEnumerable<ClientViewModel> GetClients()