Метод WebAPI считывает несколько найденных действий

#c# #asp.net-web-api #asp.net-web-api2

#c# #asp.net-web-api #asp.net-web-api2

Вопрос:

У меня есть два метода, оба из которых отлично работают сами по себе (т. Е. Когда один из них закомментирован), но когда оба находятся в программе, я получаю эту ошибку:

{«Сообщение»: «Произошла ошибка»., «ExceptionMessage»: «Было найдено несколько действий, соответствующих запросу: rnAddUserToGroup для типа WebAPI_POC1.Controllers.Администратор.AccountController rnGetRolesForUser для типа WebAPI_POC1.Controllers.Администратор.AccountController»,»ExceptionType»: «Система.Исключение InvalidOperationException», «StackTrace»: » в System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.Выберите действие (HttpControllerContext ControllerContext) r n в System.Web.Http.Controllers.ApiControllerActionSelector.Выберите действие (HttpControllerContext ControllerContext) r n в System.Web.Http.ApiController.Выполните синхронизацию (HttpControllerContext ControllerContext, CancellationToken CancellationToken) r n в System.Web.Http.Dispatcher.HttpControllerDispatcher.Отправьте SendAsyncCore (запрос HttpRequestMessage, CancellationToken CancellationToken) rn в System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()»}

Вот два метода в моем AccountController:

 public bool AddUserToGroup(AddUserToGroupBindingModel model)
{
    bool result = false;
    if (!ModelState.IsValid)
    {
        return resu<
    }

    var user = UserManager.FindByName(model.UserEmail);

    if (user != null)
    {
        var tmp = UserManager.AddToRole(user.Id, model.GroupName);
        result = ((tmp.Succeeded) ? true : false);
    }

    return resu<
}

[HttpPost]
public IEnumerable<string> GetRolesForUser(GetUserGroupsBindingModel model)
{
    var user = UserManager.FindByName(model.UserEmail);
    List<string> roles = new List<string>();

    if (user != null)
    {
        roles = new List<string>(UserManager.GetRoles(user.Id));
    }

    return roles;
}
  

Важная деталь: я использую другую конфигурацию маршрута следующим образом:

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

config.Services.Replace(typeof(IHttpControllerSelector), new NamespaceHttpControllerSelector(config));
  

Код взят из http://blogs.msdn.com/b/webdev/archive/2013/03/08/using-namespaces-to-version-web-apis.aspx который я реализовал, чтобы я мог использовать пространства имен для разделения моих разных контроллеров.

Почему WebAPI не может найти эти два разных действия контроллера, которые имеют разные имена, разные подписи и разные типы возвращаемых данных?

Комментарии:

1. Я предполагаю, что Get это глагол.

2.В ваших комментариях к методу говорится, api/Account/GetUserRoles но ваш запрос адресован /api/ администратору /account/GetRolesForUser . Я вижу, что вы меняете имя с GetRolesForUser , но дополнительное /admin/ — это то, на чем я зациклился. Вы также могли бы попробовать изменить параметры, чтобы ([FromUri]string userEmail)

3. @DanielA. Белый Я попытался изменить его на просто, RolesForUser?userEmail=alice чтобы смягчить как Get глагол, так и амперсанд, но он по-прежнему выдает мне 404.

4. @Tom извините, я удалил комментарии. У меня есть префикс пространства имен перед именем контроллера (admin). Как я уже сказал, другой метод работает нормально; он достигает точки останова и всего остального при отладке, только по какой-то причине не этот.

Ответ №1:

Проверьте свой WebApiConfig, возможно, в нем есть что-то подобное?

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

Вы пробовали свою операцию get подобным образом?
«/api/admin/account/GetRolesForUser/alice@wonderland.com»

Если это сработает, возможно, добавление [FromUrl] к вашей операции следующим образом:

 public bool GetRolesForUser([FromUrl] string userEmail)
  

Комментарии:

1. Это не должно иметь значения, поскольку он использует атрибутивную маршрутизацию.

2. Я использую другую конфигурацию маршрута. Я обновил вопрос с его помощью.

3. хм, похоже, это немного меняет ход игры, пользователь8472, вы уверены, что удаление этой строки не решит проблему?

Ответ №2:

Я исправил это, изменив свой маршрут следующим образом. Спасибо всем за их помощь.

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

config.Services.Replace(typeof(IHttpControllerSelector), new NamespaceHttpControllerSelector(config));
  

Комментарии:

1. Не могли бы вы поделиться своей реализацией IHttpControllerSelector? У меня такая же проблема.

2. @Gandarez Это очень похоже на это github.com/valeravorobjev/SampleHttpControllerSelector/blob /…

Ответ №3:

[Маршрут(«api/Controller-Name/Method-Name»)] [HttpPost]

Комментарии:

1. Не могли бы вы поделиться еще каким-нибудь контекстом?