WebApi - 具有相同签名的多个GET操作 - 路由问题

时间:2016-06-29 13:52:16

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-web-api

问题背景:

我的WebApi中有一个控制器,它有两个操作方法。这两个动作方法都是GET并且没有参数。

一个操作方法名为'GetMessages',另一个名为'GetEmployeeList'。

问题:

以下是我的控制器中的操作方法:

[HttpGet]
public string GetMessages()
{
  return "Get Messages Endpoint";
}

[HttpGet]
public string GetEmployeeList()
{
    return "Get Employees Endpoint";
}

这些是我用WepApiConfig设置的海关路线

  config.Routes.MapHttpRoute(
  name: "Messages",
  routeTemplate: "v2/api/People/{action}/{id}",
  defaults: new { action = "GetMessages", id = RouteParameter.Optional });


   config.Routes.MapHttpRoute(
   name: "Employees",
   routeTemplate: "v2/api/People/{action}/{id}",
   defaults: new { action = "GetEmployeeList", id = RouteParameter.Optional});

当我打电话给pf以下网址时:

/v2/api/People/GetMessages
/v2/api/People/GetEmployeeList

我收到以下异常消息,指出多个操作与URL请求匹配:

Multiple actions were found that match the request: System.Net.Http.HttpResponseMessage GetMessages() on type Persons.PeopleController System.Net.Http.HttpResponseMessage GetEmployeeList() on Persons.PeopleController

我如何纠正这一点,以便我一起使用两个具有相同签名的GET动作方法?

3 个答案:

答案 0 :(得分:3)

我可能不明白这一点,但为什么不简单地调整这样的路线(请注意路线模板中的动作名称):

config.Routes.MapHttpRoute(
  name: "Messages",
  routeTemplate: "v2/api/People/GetMessages/{id}",
  defaults: new { action = "GetMessages", id = RouteParameter.Optional });

config.Routes.MapHttpRoute(
   name: "Employees",
   routeTemplate: "v2/api/People/GetEmployeeList/{id}",
   defaults: new { action = "GetEmployeeList", id = RouteParameter.Optional});

但是我宁愿选择更通用的选项:

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

通过这种方式,您可以使用单一路线覆盖这两个操作。有没有理由不选择这个选项?

答案 1 :(得分:1)

你不需要有两条路线。一个就够了。尝试将路线更改为以下内容。

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

您可以尝试单独指定路线,但不一定要这样做。确保您对网络API的调用100%正确。

答案 2 :(得分:0)

如何分别为每种方法指定路线?

[RoutePrefix("api/people")]
public class MyController : ApiController
{
    [HttpGet]
    [Route("messages")]
    public string GetMessages()
    {
      return "Get Messages Endpoint";
    }

    [HttpGet]
    [Route("employees")]
    public string GetEmployeeList()
    {
        return "Get Employees Endpoint";
    }
}    

所以你会得到像你的网址

/v2/api/people/messages
/v2/api/people/employees

其中IMHO看起来比你的例子更加RESTful