ASP.NET Web API路由和操作选择

时间:2013-06-19 07:52:59

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

我的控制器路由和操作选择有问题。 我的路由如下:

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

我的控制器如下:

[HttpGet]
public Customers GetCustomers()
{
}

[HttpGet]
public Customer GetCustomerDetail(int id)
{
}

[ActionName("orders")]
[HttpGet]
public Orders GetCustomerOrders(int id)
{
}

我可以致电http://localhost/customers,我可以致电http://localhost/customers/1/orders。 但是当我尝试调用http://localhost/customers/1时,我会收到错误消息“找到了与请求匹配的多个操作:”(与GetCustomerDetail和GetCustomerOrders匹配)。

知道如何解决这个问题吗?

THX

1 个答案:

答案 0 :(得分:0)

您可以将路由更改为:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{controller}",
    defaults: new { action = "GetCustomers" });

config.Routes.MapHttpRoute(
    name: "DefaultApiWithIdAndAction",
    routeTemplate: "{controller}/{id}/{action}",
    defaults: new { action="GetCustomerDetail" });

编辑: 如果所有控制器方法都遵循相同的模式,则可以执行以下操作:

[ActionName("default")]
[HttpGet]
public Customers GetCustomers()
{
}

[ActionName("default")]
[HttpGet]
public Customer GetCustomerDetail(int id)
{
}

[ActionName("orders")]
[HttpGet]
public Orders GetCustomerOrders(int id)
{
}

然后你可以使用一条路线:

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