使用Action消除ASP.NET WebAPI路由中的歧义

使用Action消除ASP.NET WebAPI路由中的歧义,asp.net,asp.net-web-api,asp.net-web-api-routing,wcf-web-api,Asp.net,Asp.net Web Api,Asp.net Web Api Routing,Wcf Web Api,嗨,我这里有休息服务 获取管理员/授权用户 获取管理员/delegateduser/id 获得授权 我成功地使用此映射配置了路由: config.Routes.MapHttpRoute( name: "ActionApiWithId", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );

嗨,我这里有休息服务

  • 获取管理员/授权用户
  • 获取管理员/delegateduser/id
  • 获得授权
我成功地使用此映射配置了路由:

   config.Routes.MapHttpRoute(
       name: "ActionApiWithId",
       routeTemplate: "api/{controller}/{action}/{id}",
       defaults: new { id = RouteParameter.Optional }
   );  


config.Routes.MapHttpRoute(
              name: "DefaultApi",
              routeTemplate: "api/{controller}/{id}",
              defaults: new { id = RouteParameter.Optional }
          );
这个控制器呢

public class AdminController : ApiController
{
    // GET api/admin/delegatedusers
    [ActionName("delegatedusers")]
    public IEnumerable<x> Get()
    {
    }

    // GET api/delegatedusers/<userid>
    [ActionName("delegatedusers")]
    public x Get(String id)
    {
    }
}

 public class DelegatedUsersController : ApiController
{
    public x Get()
    {
    }
}
公共类AdminController:ApicController
{
//获取api/admin/delegatedusers
[行动名称(“被授权人”)]
公共IEnumerable Get()
{
}
//获取api/delegatedusers/
[行动名称(“被授权人”)]
公共x获取(字符串id)
{
}
}
公共类DelegatedUserController:ApiController
{
公共x Get()
{
}
}
问题是我添加了一个没有正确解决的新方法。方法是

  • 删除注册请求/id
使用此映射和控制器

config.Routes.MapHttpRoute(
          name: "DefaultApi",
          routeTemplate: "api/{controller}/{id}",
          defaults: new { id = RouteParameter.Optional }
      );         

public class EnrollRequestController : ApiController
{      
    /// DELETE api/enrollrequest/<id>   
    public void Delete(String id)
    {
    }
}
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);         
公共类注册请求控制器:ApiController
{      
///删除api/注册请求/
公共无效删除(字符串id)
{
}
}
如果我将DefaultApi路由映射放在WebApiConfig文件的顶部,那么这个新方法将得到解决,但GET-admin/delegateduser则没有。看起来这两种方法在URL解析上有冲突

映射方法的正确方式是什么?也许一切都应该更简单,而我变得太复杂了

任何帮助都是好的


提前谢谢。

我终于找到了解决方案

冲突在于DELETE enrollrequest/和GET admin/delegateduser都符合规则

{controller}/id
{controller}/action
我通过以下方式解决了添加约束的问题:

 config.Routes.MapHttpRoute(
           name: "ActionApiWithId",
           routeTemplate: "api/{controller}/{action}/{id}",
           defaults: new { id = RouteParameter.Optional },
           constraints: new { action = "delegatedusers" }
          );      

现在,调用DELETE-enrollrequest/不适合路由,因为不满足约束

为什么没有为端点指定HttpMethod([HttpDelete]、[HttpPost]、[HttpGet]、[HttpPut])?你考虑过使用吗?嗨,助推器。理论上,不需要指定方法,因为方法名称以Get、Delete开头。无论如何,我已经尝试指定它,没有任何更改。我使用的是Web API 1,因此我担心AttributeRouting不可用。