Web API方法读取找到的多个操作

时间:2014-07-02 20:40:36

标签: c# asp.net-web-api asp.net-web-api2

我有两种方法,两种方法都完全适用于他们自己的(即当其中一种被注释掉时),但当两者都在程序中时,我收到此错误:

  

{"消息":"发生了错误。"," 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无法找到具有不同名称,不同签名和不同返回类型的这两种不同的控制器操作?

3 个答案:

答案 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]