【问题标题】:Is it possible to have two controllers with the same route?是否可以有两个具有相同路由的控制器?
【发布时间】:2020-01-16 09:39:29
【问题描述】:

是否可以在两个程序集中有两个控制器具有相同的 Route 前缀属性,但操作上的 Route 属性不同?

    [RoutePrefix("api/route")]
    public class Controller1 : ApiController
    {
        [Route("action1")]
        [HttpPost]
        public async Task<HttpResponseMessage> Post([FromBody] string body)
        { }      

        [Route("{id}")]
        public async Task<HttpResponseMessage> Delete(string id)
        { }    
    }

    [RoutePrefix("api/route")]
    public class Controller2 : ApiController
    {
        [Route("action2")]
        [HttpPost]
        public async Task<HttpResponseMessage> Post([FromBody] string body)
        { }          
    }

【问题讨论】:

  • 我认为如果methid路线不同不是问题,但如果同一路线找不到它
  • 在这种情况下,我认为这将是不同的路由,因为 Controller1.Action1 和 Controller2.Action2 将是不同的路由,但似乎当它们共享路由前缀(在这种情况下为 api/route)时,它不会工作

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


【解决方案1】:

这是可能的。我的问题是第一个控制器定义了一个带有路由“{id}”的删除操作。由于 id 是一个不受约束的参数,Web Api 无法看到“api/route/action2”和“api/route/idtodelete”之间的区别。

我最终在删除上创建了一个正则表达式约束,它排除了“action2”并允许所有字母数字字符。现在可以了。

[HttpDelete]
[Route("{id:regex(^(?!action2)[a-zA-Z0-9]*$)}")]

【讨论】:

    【解决方案2】:

    如果您对所有操作方法使用不同的路线,那么它将起作用。但是,如果您使用相同的 Route 前缀和相同的 Route 操作,则会出错。

    【讨论】:

      猜你喜欢
      • 2015-08-19
      • 2014-10-07
      • 2017-03-10
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      相关资源
      最近更新 更多