我有:

[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
}


路由重写所使用的策略是获取均指向“ OrderController”的名为“ / api / Order / 1”或“ / api / ManualOrder / 1”的“ Get”方法,此方法有效。

问题是当我在“ ManualOrder”中请求任何其他方法时,我认为它迷路了,无法解析并返回异常:


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


有谁知道如何解决这个问题而不在两个控制器上都重复“ Get”方法?

附言:这是一个假设的例子。

最佳答案

我确信您的示例比您在此处提出的示例要复杂得多。但是根据示例中的信息,您可以让ManualOrderControllerOrderController继承。我认为分配路线时更有意义。 Route属性将不会被继承,因此应该没有任何问题。


  有谁知道如何解决这个问题而不重复“获取”
  两个控制器上的方法?


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

[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可能会在ExampleOtherNormalMethod上调用OrderController。这可能是或可能不是期望的行为。

10-05 21:11