2012-04-12 53 views
42

在MVC4中使用新的Api控制器,我发现一个问题。如果我有以下几种方法:Api控制器声明多个Get语句

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 
} 

回答

62

这是所有路由。默认的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

这样你可以在控制器中有多个GetAll

这里还有一件重要的事情是,在使用这种路由方式时,必须使用属性来指定允许的HTTP方法(如[HttpGet])。

还拥有传统的方法默认的Web API动词基于路由的混合选项,这是很好的描述如下:

+0

快速的问题,我可以路线是这样,仍然叫我的方法只有“邮报”和让它们自动只接受HttpPost如果我包括ActionNameAttribute? – Alxandr 2012-05-05 23:14:37

+0

@Alxandr您仍然必须使用AcceptVerbsAttribute(或HttpPostAttribute,HttpGetAttribute等) – tpeczek 2012-05-06 17:40:52

+3

我有一些问题,路由 - 我可以定义多个“GET”方法,但如果我打/ API/{}控制器服务器给HTTP 500“找到多个动作”而不是404。任何想法如何阻止这个?我想要的是将/ api/{controller}/{id}路由到“Get,Post,Put,Delete等”,然后让/ api/{controller}/{id}/{action}路由到一个特定的动作,例如/ api/Customers/5/Products。不起作用 - 一切都会导致“发现多个操作”错误。 – ShadowChaser 2012-05-16 16:04:24

9

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

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

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

路由属性链接对于那些甚至更好奇这种格式是什么:https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-路由功能于Web的API-2 – Callat 2017-06-19 20:16:57