43

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

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

这将起作用。但是,如果我想检索一些不同类型的不同数据,它默认为GetAll方法,即使$.getJSON设置为GetAllIntegers方法:

public IEnumberable<int> GetAllIntergers()

(错误的命名约定)

我有可能做到这一点吗?

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

我认为更容易想象我想要实现的目标。这是一段代码,用于显示我希望能够做的事情,在一个单一的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
}
4

2 回答 2

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 } 
);

之后,您可以使用以下 URL 提出请求:

  • api/yourapicontroller/GetClients
  • api/yourapicontroller/GetStaffMembers

这样你就可以GetAll在Controller中有多个。

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

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

于 2012-04-12T11:13:43.190 回答
10

以防其他人面临这个问题。这是我解决这个问题的方法。使用控制器上的 [Route] 属性路由到特定的 url。

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

[Route("api/getAllClients")]
public IEnumerable<ClientViewModel> GetClients()
于 2015-03-03T18:00:54.947 回答