WebApi路由标识与同一URL匹配的多个控制器类型。怎么解决?

时间:2016-12-01 14:06:49

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

我有:

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

路线重写所使用的策略是获得&#34; Get&#34;称为&#34; / api / Order / 1&#34;或&#34; / api / ManualOrder / 1&#34;两者都指向&#34; OrderController&#34;,这是有效的。

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

  

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

有没有人知道怎么解决这个问题而不重复&#34; Get&#34;两个控制器上的方法?

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

1 个答案:

答案 0 :(得分:2)

我确信你的例子比你在这里提出的要复杂得多。但根据您示例中的信息,您可以ManualOrderController继承OrderController。我认为在分配路线时更有意义。 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。这可能或者可能不是,是一种理想的行为。

相关问题