【问题标题】:WebApi - Multiple GET actions with identical signatures - routing issueWebApi - 具有相同签名的多个 GET 操作 - 路由问题
【发布时间】:2016-06-29 13:52:15
【问题描述】:

问题背景:

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

当我调用以下 URL 时:

/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 操作方法?

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    您可以尝试单独指定路线,但您不应该这样做。确保您对 Web api 的调用是 100% 正确的。

    【讨论】:

      【解决方案3】:

      分别为每个方法指定路由怎么样?

      [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
      

      恕我直言,哪个看起来比您的示例更 RESTful

      【讨论】:

        猜你喜欢
        • 2016-09-22
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        • 2015-08-14
        • 1970-01-01
        • 2022-01-14
        • 1970-01-01
        • 2017-05-27
        相关资源
        最近更新 更多