AspNet.WebApi.Versioning изменяет поведение привязки модели для параметров IEnumerable - PullRequest
0 голосов
/ 25 октября 2018

Я недавно представил пакет 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
...