我有两种方法,两种方法都完全适用于他们自己的(即当其中一种被注释掉时),但当两者都在程序中时,我收到此错误:
{"消息":"发生了错误。"," ExceptionMessage":"多个 找到与请求匹配的操作:\ r \ nAddUserToGroup类型 WebAPI_POC1.Controllers.Admin.AccountController \ r \ nGetRolesForUser on 类型 WebAPI_POC1.Controllers.Admin.AccountController"" ExceptionType":" System.InvalidOperationException""堆栈跟踪":" 在 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 请求,取消语音取消语言)\ 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;
}
重要细节:我正在使用不同的Route配置:
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无法找到具有不同名称,不同签名和不同返回类型的这两种不同的控制器操作?
答案 0 :(得分:1)
检查你的WebApiConfig,它可能有这样的东西吗?
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{Id}",
defaults: new { id = RouteParameter.Optional }
);
您是否尝试过这样的get操作? &#34; /api/admin/account/GetRolesForUser/alice@wonderland.com"
如果可行的话可能会在您的操作中添加[FromUrl],如下所示:
public bool GetRolesForUser([FromUrl] string userEmail)
答案 1 :(得分:1)
我通过改变我的路线来解决这个问题。感谢大家的帮助。
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));
答案 2 :(得分:0)
[Route(“ api / Controller-Name / Method-Name”)] [HttpPost]