【问题标题】:Multiple actions were found that match the request http post method找到多个与请求 http post 方法匹配的操作
【发布时间】:2014-06-14 01:52:15
【问题描述】:

我对 Web Api 2 有疑问。 我在我的 ContactGroupsController web api 中编写了这 3 个操作。

// POST api/contactgroups
[System.Web.Http.HttpPost]
public IEnumerable<ContactsGroup> All()
{
    return _biz.GetAllContactsGroup();
}




// POST api/contactgroups/5
[System.Web.Http.HttpPost]
public ContactsGroup FindById(int id)
{
    return _biz.GetContactGroup(id);
}




// POST api/contactgroups
public HttpResponseMessage CreateContactGroup(ContactsGroup item)
{
    item.UserId = HttpContext.Current.User.Identity.GetUserId();
    item.DateAdded = DateTime.Now;

    if (!ModelState.IsValid)
        return Request.CreateResponse(HttpStatusCode.NotAcceptable, item);

    if (!_biz.CreateContactGroup(item)) return Request.CreateResponse(HttpStatusCode.NotFound, item);

    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, item);
    response.Headers.Location = new Uri(Request.RequestUri + item.Id.ToString());
    return response;
}

当我想向“/api/contactgroups”发送 http post 方法时,会出现此错误:

  {
    "$id": "1",
    "Message": "An error has occurred.",
    "ExceptionMessage": "Multiple actions were found that match the request: \r\nSystem.Collections.Generic.IEnumerable`1[NikSms.Models.ContactsGroup] All() on type NikSms.Web.Api.ContactGroupsController\r\nSystem.Net.Http.HttpResponseMessage CreateContactGroup(NikSms.Models.ContactsGroup) on type NikSms.Web.Api.ContactGroupsController",
    "ExceptionType": "System.InvalidOperationException",
    "StackTrace": "   at System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n   at System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n   at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage request, CancellationToken cancellationToken)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()"
}

这是 WebApiConfig.cs 的内容:

config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
                                     "DefaultApiCtrl",
                                     "api/{controller}/{action}/{id}",
                                     new { id = RouteParameter.Optional});

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

谁能帮我解决?

【问题讨论】:

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


    【解决方案1】:

    我在这里找到了更好的解决方案: 我们可以使用前缀 [RouteName("someRouteName")] 请参阅下面的链接,Mike wasson 在Route Prefixes

    中对其进行了描述

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      添加 ActionName 属性将解决问题。

      // POST api/contactgroups/all
          [System.Web.Http.ActionName("All")]
          public IEnumerable<ContactsGroup> All()
          {
              return _biz.GetAllContactsGroup();
          }
      
          // POST api/contactgroups/find/5
          [System.Web.Http.ActionName("Find")]
          public ContactsGroup FindById(int id)
          {
              return _biz.GetContactGroup(id);
          }
      
          // POST api/contactgroups/create
          [System.Web.Http.ActionName("Create")]
          public HttpResponseMessage CreateContactGroup(ContactsGroup item)
          {
              item.UserId = HttpContext.Current.User.Identity.GetUserId();
              item.DateAdded = DateTime.Now;
      
              if (!ModelState.IsValid)
                  return Request.CreateResponse(HttpStatusCode.NotAcceptable, item);
      
              if (!_biz.CreateContactGroup(item)) return Request.CreateResponse(HttpStatusCode.NotFound, item);
      
              HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, item);
              response.Headers.Location = new Uri(Request.RequestUri + item.Id.ToString());
              return response;
          }
      

      【讨论】:

      • 您不仅在答案中添加了 [ActionName],还替换了 [HttpPost]。至少对我来说,我必须同时保留两者,才能使解决方案发挥作用。无论如何谢谢小费!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多