Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebAPI方法读取找到的多个操作_C#_Asp.net Web Api_Asp.net Web Api2 - Fatal编程技术网

C# WebAPI方法读取找到的多个操作

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,“异

我有两种方法,两种方法都能完美工作,一种是它们自己的方法(即,当其中一种被注释掉时),但当两种方法都在程序中时,我得到以下错误:

{“消息”:“出现错误。”,“异常消息”:“多个” 找到与以下请求匹配的操作:\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中的两种方法:

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));