C# WebAPI方法读取找到的多个操作
我有两种方法,两种方法都能完美工作,一种是它们自己的方法(即,当其中一种被注释掉时),但当两种方法都在程序中时,我得到以下错误: {“消息”:“出现错误。”,“异常消息”:“多个” 找到与以下请求匹配的操作:\r\n类型上的nAddUserToGroup WebAPI\u POC1.Controllers.Admin.AccountController\r\n上的TrolesForUser 类型 WebAPI_POC1.Controllers.Admin.AccountController,“异常类型”:“System.InvalidOperationException”,“StackTrace”:” 在 System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext)\r\n位于 System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext)\r\n位于 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext,CancellationToken CancellationToken)\r\n位于 System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage 请求,CancellationToken CancellationToken)\r\n位于 System.Web.Http.Dispatcher.HttpControllerDispatcher.d_u0.MoveNext()“} 以下是my AccountController中的两种方法:C# WebAPI方法读取找到的多个操作,c#,asp.net-web-api,asp.net-web-api2,C#,Asp.net Web Api,Asp.net Web Api2,我有两种方法,两种方法都能完美工作,一种是它们自己的方法(即,当其中一种被注释掉时),但当两种方法都在程序中时,我得到以下错误: {“消息”:“出现错误。”,“异常消息”:“多个” 找到与以下请求匹配的操作:\r\n类型上的nAddUserToGroup WebAPI\u POC1.Controllers.Admin.AccountController\r\n上的TrolesForUser 类型 WebAPI_POC1.Controllers.Admin.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;
}
代码是我实现的代码,因此我可以使用名称空间来分隔不同的控制器
为什么WebAPI找不到这两个不同的控制器操作,它们有不同的名称、不同的签名和不同的返回类型?检查您的WebApiConfig,它可能有类似的内容
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{Id}",
defaults: new { id = RouteParameter.Optional }
);
你试过这样做吗?
“/api/admin/account/GetRolesForUser/alice@wonderland.com"
如果可以的话,可以向您的操作中添加[FromUrl],如下所示:
public bool GetRolesForUser([FromUrl] string userEmail)
我通过这样改变路线来解决这个问题。谢谢大家的帮助
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));
[路由(“api/控制器名称/方法名称”)]
[HttpPost]我猜
Get
是一个动词。您对该方法的注释是api/Account/GetUserRoles
,但您的请求是针对/api/
管理员/Account/GetRolesForUser
。我看到您更改了GetRolesForUser
的名称,但是额外的/admin/
是我挂断的。您也可以尝试将参数更改为([FromUri]string userEmail)
@DanielA.White我尝试将其更改为RolesForUser?userEmail=alice
,以减轻Get
动词和符号的负担,但它仍然给我一个404。@Tom抱歉,我删除了注释。我在控制器名称(admin)之前有一个名称空间前缀。就像我说的,另一种方法很好;调试时,它会命中断点和所有东西,但由于某种原因,不是这个。这不重要,因为他使用的是属性路由。我使用的是不同的路由配置。我用它更新了问题。嗯,这似乎确实稍微改变了游戏规则。用户8472,您确定删除该行并不能解决问题吗?您可以分享您的IHttpControllerSelector实现吗?我也有同样的问题。@Gandarez很像这样,你能分享更多的背景吗?
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));