我有:
[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”方法?
附言:这是一个假设的例子。
最佳答案
我确信您的示例比您在此处提出的示例要复杂得多。但是根据示例中的信息,您可以让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
。这可能是或可能不是期望的行为。