使用 Action 在 ASP.NET WebAPI 路由中消除歧义
Disambiguation in ASP.NET WebAPI routing using Action
嗨,我有这个 REST 服务
- 获取 admin/delegateduser
- 获取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()
{
}
}
问题是我添加了一个新的方法没有正确解决。方法是
- 删除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 分辨率上发生冲突。
映射方法的正确方法是什么?可能一切都应该更简单,而我太复杂了....
欢迎任何帮助。
提前致谢。
终于找到解决办法了,
冲突是 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/ 不符合路线,因为没有满足约束条件。
嗨,我有这个 REST 服务
- 获取 admin/delegateduser
- 获取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()
{
}
}
问题是我添加了一个新的方法没有正确解决。方法是
- 删除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 分辨率上发生冲突。
映射方法的正确方法是什么?可能一切都应该更简单,而我太复杂了....
欢迎任何帮助。
提前致谢。
终于找到解决办法了,
冲突是 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/ 不符合路线,因为没有满足约束条件。