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

时间:2015-04-20 16:39:19

标签: asp.net asp.net-web-api asp.net-web-api-routing wcf-web-api

您好我有这个REST服务

  • 获取admin / delegateduser
  • 获取admin / delegateduser / id
  • GET delegateduser

我使用此映射成功配置路由:

   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()
    {
    }
}

问题是我添加了一个未正确解析的新方法。方法是

  • DELETE enrollrequest / 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)
    {
    }
}

如果我将DefaultApi routMapping置于WebApiConfig文件之上,则此新方法已解决,但GET admin / delegateduser未解析。所以看起来这两种方法在URL解析上存在冲突。

如何正确映射方法?可能一切都应该更简单,我太复杂了....

任何帮助都很受欢迎。

提前致谢。

1 个答案:

答案 0 :(得分:0)

最后我找到了解决方案,

冲突是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 /不适合路线,因为不满足约束。