找到了与请求http post方法匹配的多个操作

Ham*_*mid 6 c# asp.net-web-api asp.net-web-api-routing

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

当我想将http post方法发送到"/ api/contactgroups"时,会出现以下错误:

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

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

任何人都可以帮我解决吗?

Ham*_*mid 10

我在这里找到了一个更好的解决方案:我们可以使用前缀[RouteName("someRouteName")],请参阅下面链接Mike Wasson在路线前缀中描述它

希望能帮助到你


Ham*_*mid 6

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