【问题标题】:Web API routing, two routes matchesWeb API 路由,两条路由匹配
【发布时间】:2013-08-09 14:10:49
【问题描述】:

我在ApiController 中设置了以下两个操作:

[POST("api/admin/image/{id}/upload")]
[Authorize(Roles = RoleNames.Administrator)]
public Foo UploadVersion(int id)

public Bar Post(int id, Baz x) {}

鉴于此路由配置,它们存在冲突:

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

我的猜测是UploadVersion 也通过路由映射获得了某种默认路由,但我该如何防止呢?

如果有人想知道我要做什么:

POST /api/admin/image/{id}/upload -> UploadVersion()
POST /api/admin/image/{id}        -> Post()

【问题讨论】:

  • 尝试路由 "api/admin/{controller}/{id}/{action}。在路由默认值中添加 action="DefaultAction"。为 Post 方法添加 [ActinoName("DefaultAction")]。详情在blog.appliedis.com/2013/03/25/…
  • 我无法让它工作。无论我对这两条路线做什么,它们似乎都会发生碰撞。现在我已经将Post() 更改为Put(),所以我至少可以测试一下功能。

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


【解决方案1】:

根据你设置的路由,它们是相同的路由,没有办法区分。你每次都会得到这条路线:

POST /api/admin/image/{id}        -> Post()

尝试修改您的路线,使其看起来像这样:

POST /api/admin/image/upload/{id} -> UploadVersion()
POST /api/admin/image/{id}        -> Post()

【讨论】:

  • 我将POST-属性更改为[POST("api/admin/image/upload/{id}")]。这仍然给出相同的错误(缩短以匹配示例):找到与请求匹配的多个操作: Foo UploadedVersion(Int32) on type ImageController Bar Post(Int32, Baz) on type ImageController
  • 尝试完全修改或删除“api/admin/{controller}/{id}”路由配置。我认为它正在挂断那个。如,它试图将您的“图像”路径解析为控制器,并且该路由实际上与您的“api/admin/{controller}/{id}”匹配。
  • 我也试过了,但无法正常工作。我暂时(可能是永久?)将 Post() 更改为 Put(),这样我就可以继续其他工作了,但解决这个问题会很棒。
猜你喜欢
  • 2017-11-05
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 2018-11-27
  • 2018-10-04
  • 2012-07-13
  • 2017-03-24
  • 1970-01-01
相关资源
最近更新 更多