【问题标题】:WebAPI Method Reads Multiple Actions FoundWebAPI 方法读取找到的多个操作
【发布时间】: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


【解决方案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)

【讨论】:

  • 这应该没关系,因为他正在使用属性路由。
  • 我正在使用不同的路由配置。我用它更新了问题。
  • 嗯,这似乎确实改变了球赛 user8472,您确定删除该行不能解决问题吗?
【解决方案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));

【讨论】:

【解决方案3】:

[Route("api/Controller-Name/Method-Name")] [HttpPost]

【讨论】:

  • 你能再分享一些上下文吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2017-10-26
  • 2016-10-18
  • 2016-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多