【问题标题】:Disambiguation in ASP.NET WebAPI routing using Action使用 Action 消除 ASP.NET WebAPI 路由中的歧义
【发布时间】:2015-06-27 12:19:09
【问题描述】:

您好,我有这个 REST 服务

  • GET admin/delegateduser
  • GET admin/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()
    {
    }
}

问题是我添加了一个没有正确解决的新方法。方法是

  • 删除注册请求/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 解析上存在冲突。

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

欢迎任何帮助。

提前致谢。

【问题讨论】:

  • 为什么没有为端点([HttpDelete]、[HttpPost]、[HttpGet]、[HttpPut])指定HttpMethod?您是否考虑过使用AttributeRouting
  • 嗨助推器。理论上不需要指定方法,因为方法名以Get、Delete开头。无论如何,我已经尝试指定它而没有更改。我正在使用 Web API 1,所以恐怕 AttributeRouting 不可用。

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


【解决方案1】:

终于找到了解决办法,

冲突在于 DELETEenrollrequest/ 和 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" }
          );      

现在调用 DELETEenrollrequest/ 不适合路由,因为不满足约束。

【讨论】:

    猜你喜欢
    • 2013-10-04
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多