我有:
[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:这是一个假设的例子。
答案 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
。这可能或者可能不是,是一种理想的行为。