【问题标题】:WebApi route identifying several controller types that match the same URL. How to solve?WebApi 路由标识匹配相同 URL 的多个控制器类型。怎么解决?
【发布时间】:2016-12-01 14:06:48
【问题描述】:

我有:

[RoutePrefix("api/Order")]
public class OrderController : ApiController
{
    [Route("~/api/Order/{id}")]
    [Route("~/api/ManualOrder/{id}")]
    [HttpGet]
    public Task<HttpResponseMessage> Get(Guid id)
    {
        //Implementation
    }

    [Route("ExampleOtherNormalMethod")]
    [HttpGet]
    public Task<HttpResponseMessage> ExampleOtherNormalMethod()
    {
        //Implementation
    }
}

还有:

[RoutePrefix("api/ManualOrder")]
public class ManualOrderController : ApiController
{
    //Other methods
}

路由重写使用的策略是让名为“/api/Order/1”或“/api/ManualOrder/1”的“Get”方法都指向“OrderController”,这是可行的。

问题是当我在“ManualOrder”中请求任何其他方法时,我认为它会丢失并且无法解决并返回异常:

找到多个与 URL 匹配的控制器类型。如果多个控制器上的属性路由与请求的 URL 匹配,就会发生这种情况。 该请求找到了以下匹配的控制器类型: Project.ProxyAPI.Controllers.ManualOrderController Projects.ProxyAPI.Controllers.OrderController

有谁知道如何在不复制两个控制器上的“Get”方法的情况下解决这个问题?

P.s:这是一个假设的例子。

【问题讨论】:

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


    【解决方案1】:

    我确信您的示例比您在此处提供的示例要复杂得多。但是根据您示例中的信息,您可以让ManualOrderController 继承自OrderController。我认为分配路线时更有意义。 Route-attributes 不会被继承,所以应该没问题。

    有没有人知道如何在不重复“获取”的情况下解决这个问题 两个控制器上的方法?

    是的,这将是一个重复,但它不会包含任何逻辑它只是一个失败...

    [RoutePrefix("api/Order")]
    public class OrderController : ApiController
    {
        [Route("~/api/Order/{id}")]
        [HttpGet]
        public virtual Task<HttpResponseMessage> Get(Guid id)
        {
            //Implementation
        }
    
        [Route("ExampleOtherNormalMethod")]
        [HttpGet]
        public Task<HttpResponseMessage> ExampleOtherNormalMethod()
        {
            //Implementation
        }
    }
    
    [RoutePrefix("api/ManualOrder")]
    public class ManualOrderController : OrderController 
    {
        [Route("~/api/ManualOrder/{id}")]
        [HttpGet]
        public override Task<HttpResponseMessage> Get(Guid id)
        {
            return base.Get(id);
        }
    
        //Other methods
    }
    

    这种方法有一个缺点 - ManualOrderController 将通过您的默认路由表公开来自 OrderController 的方法。根据您的路由表的样子api/ManualOrder/ExampleOtherNormalMethod可以OrderController 上调用ExampleOtherNormalMethod。这可能是,也可能不是,是一种期望的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      相关资源
      最近更新 更多