【发布时间】:2014-07-02 20:40:35
【问题描述】:
我有两种方法,它们各自完美地工作(即当其中一个被注释掉时)但是当它们都在程序中时,我得到这个错误:
{"Message":"发生错误。","ExceptionMessage":"多个 找到与请求匹配的操作: \r\nAddUserToGroup on type WebAPI_POC1.Controllers.Admin.AccountController\r\nGetRolesForUser on 类型 WebAPI_POC1.Controllers.Admin.AccountController","ExceptionType":"System.InvalidOperationException","StackTrace":" 在 System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext 控制器上下文)\r\n 在 System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext 控制器上下文)\r\n 在 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancelToken)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage 请求,CancellationToken cancelToken)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__0.MoveNext()"}
这是我的 AccountController 中的两个方法:
public bool AddUserToGroup(AddUserToGroupBindingModel model)
{
bool result = false;
if (!ModelState.IsValid)
{
return result;
}
var user = UserManager.FindByName(model.UserEmail);
if (user != null)
{
var tmp = UserManager.AddToRole(user.Id, model.GroupName);
result = ((tmp.Succeeded) ? true : false);
}
return result;
}
[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 找不到这两个不同名称、不同签名和不同返回类型的不同控制器操作?
【问题讨论】:
-
我猜
Get是动词。 -
你的方法的 cmets 说
api/Account/GetUserRoles但你的请求是/api/admin/account/GetRolesForUser。我看到您将名称从GetRolesForUser更改为,但额外的/admin/是我挂断的。您也可以尝试将参数更改为([FromUri]string userEmail) -
@DanielA.White 我尝试将其更改为
RolesForUser?userEmail=alice以减轻Get动词和 & 符号,但它仍然给我一个 404。 -
@Tom 抱歉,我删除了 cmets。我在控制器名称(管理员)之前有一个命名空间前缀。就像我说的,另一种方法效果很好;由于某种原因,它在调试时会遇到断点和一切,只是不是这个。
标签: c# asp.net-web-api asp.net-web-api2