Api控制器声明多个Get语句

Nei*_*ght 43 c# asp.net-routing asp.net-mvc-4 asp.net-web-api

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

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
}
Run Code Online (Sandbox Code Playgroud)

tpe*_*zek 63

这都在路由中.默认的Web API路由如下所示:

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

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

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

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

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

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

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

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

  • 我在路由方面遇到了一些问题 - 我可以定义多个"GET"方法,但如果我点击/ api/{controller},服务器会给出一个HTTP 500"找到多个动作"而不是404.任何想法如何阻止这个?我想要的是/ api/{controller}/{id}路由到"Get,Post,Put,Delete等",然后让/ api/{controller}/{id}/{action}路由到特定操作,例如/ api/Customers/5/Products.不起作用 - 一切都给出了"发现多个动作"的错误. (3认同)
  • @uriDium看起来你正在寻找混合传统和基于动词的路由,你可以在这里阅读更多相关信息:http://blog.appliedis.com/2013/03/25/web-api-mixing-traditional-verb-基于路由/ (2认同)

Arc*_*hna 10

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

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

[Route("api/getAllClients")]
public IEnumerable<ClientViewModel> GetClients()
Run Code Online (Sandbox Code Playgroud)