Я недавно представил пакет Microsoft.AspNet.WebApi.Versioning
( github ) в своем проекте, чтобы обновить мой API.
Он работает как шарм, но, к сожалению, у него есть странная сторонаэффект.Он изменяет значение параметра по умолчанию для параметра IEnumerable<T>
uri с null
на пустое List<T>
.Я изолировал его, используя базовый пример из репозитория пакетов.
Вызов http://localhost:xxx/api/v1/helloworld возвращает
ids is null: True
, если управление версиями не включено (предыдущее поведение)
ids is null: False
, если включено управление версиями
Боюсь, что это меняет и другие поведения.Как сохранить функцию версии, но использовать привязку модели по умолчанию?
Контроллер
// breaks
[Microsoft.Web.Http.ApiVersion("1.0")]
[RoutePrefix( "api/v{version:apiVersion}/helloworld" )]
// working
//[RoutePrefix("api/v1/helloworld")]
public class HelloWorldController : ApiController
{
[Route]
public IHttpActionResult Get([FromUri] IEnumerable<Guid> ids)
{
return Ok($"ids is null: {ids == null}");
}
}
Настройка
public class Startup
{
public void Configuration( IAppBuilder builder )
{
var configuration = new HttpConfiguration();
var httpServer = new HttpServer( configuration );
// breaks:
configuration.AddApiVersioning();
var constraintResolver = new DefaultInlineConstraintResolver() { ConstraintMap = { ["apiVersion"] = typeof(ApiVersionRouteConstraint) } };
configuration.MapHttpAttributeRoutes(constraintResolver);
// defaut (works)
//configuration.MapHttpAttributeRoutes();
builder.UseWebApi( httpServer );
}
}
Воспроизвести
git clone https://github.com/smstuebe/webapi-versioning-parameter-binding.git
git checkout working
# if you want to break it
git checkout broken