Я пытаюсь заставить работать версии API Web с унаследованным классом.Я работаю с двумя очень простыми вариантами стандартного Values
контроллера.
[ApiVersion("1.0")]
[RoutePrefix("api/v{version:apiVersion}/Values")]
[ControllerName("Values")]
public class ValuesController : ApiController
{
// GET api/values
[Route("")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
[Route("{id:int}")]
public virtual string Get(int id)
{
return "value from 1";
}
}
[ApiVersion("2.0")]
[RoutePrefix("api/v{version:apiVersion}/Values")]
[ControllerName("Values")]
public class Values2Controller : ValuesController
{
//Want to use the method in the base class
//public IEnumerable<string> Get()
//{
// return new string[] { "value2-1", "value2-2" };
// }
[Route("{id:int}")]
// GET api/values/5
public new string Get(int id)
{
return "value from 2";
}
}
Моя начальная конфигурация также довольно проста.
public static void Register(HttpConfiguration config)
{
var constraintResolver = new DefaultInlineConstraintResolver()
{
ConstraintMap = {["apiVersion"] = typeof(ApiVersionRouteConstraint)}
};
config.MapHttpAttributeRoutes(constraintResolver);
config.AddApiVersioning(o => { o.AssumeDefaultVersionWhenUnspecified = true; });
}
Не переопределенные маршруты работают точнокак и следовало ожидать http://localhost:32623/api/v1.0/Values/12
-> "значение от 1" http://localhost:32623/api/v2.0/Values/12
-> "значение от 2"
Вызов v1 по умолчанию Get
Маршрут http://localhost:32623/api/v1.0/Values -> Значение1, Значение2
Однако попытка использовать тот же маршрут на дочернем контроллере приводит к ошибке.
http://localhost:32623/api/v2.0/Values
<Message>
The HTTP resource that matches the request URI 'http://localhost:32623/api/v2.0/Values' does not support the API version '2.0'.
</Message>
<InnerError>
<Message>
No route providing a controller name with API version '2.0' was found to match request URI 'http://localhost:32623/api/v2.0/Values'.
</Message>
</InnerError>
В сообщении об ошибке указывается, что переопределенный элемент ожидает "1.0", и я могу обойти это с помощью метода, подобного этому, в дочернем классе.
[Route("")]
public override IEnumerable<string> Get()
{
return base.Get();
}
Но это кажется далеко не идеальным для больших приложений.Есть ли способ заставить эту работу работать так, как мне хотелось бы, без этих «пустых» переопределений?