#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. Не могли бы вы поделиться еще каким-нибудь контекстом?