Как проверить ODataQueryOptions - PullRequest
0 голосов
/ 18 декабря 2018

Я бы хотел отклонить запрос OData, если его значение параметра $top превышает глобальный лимит.ODataQueryOptions создается вручную, и я не знаю, как правильно запустить его проверку.

Затронутые сборки

<PackageReference Include="Microsoft.AspNetCore.OData" Version="7.0.0" />

Воспроизвести шаги

Я выполняю глобальную настройку следующим образом:

public static void UseODataRoutes(this IRouteBuilder routeBuilder, 
    IEdmModel edmModel)
{
    routeBuilder.MapODataServiceRoute(RouteName,
        RoutePrefix,
        containerBuilder => containerBuilder.AddService(ServiceLifetime.Singleton, provider => edmModel));

    routeBuilder.Count().Filter().OrderBy().Select().MaxTop(1);

    routeBuilder.EnableDependencyInjection();
}

И вручную создать экземпляр ODataQueryOptions<TEntity>:

public ODataQueryFactory(IHttpContextAccessor httpAccessor, IPerRouteContainer container)
{
    _request = httpAccessor.HttpContext.Request;
    _odataServiceProvider = container.GetODataRootContainer(ODataExtentions.RouteName);
}

public ODataQueryOptions<TEntity> CreateQueryOptions<TEntity>()
    where TEntity : class
{
    var model = _odataServiceProvider.GetService<IEdmModel>();
    var path = _request.ODataFeature().Path;
    var context = new ODataQueryContext(model, typeof(TEntity), path);

    var queryOptions = new ODataQueryOptions<TEntity>(context, _request);

    return queryOptions;
}

Проблема в том, что глобальный MaxTop игнорируется, что приводит к успешному запросу GET /foo?$top=10, даже если MaxTop(1) был вызван.

Однако, если я просто добавлю:

queryOptions.Validate(new ODataValidationSettings()
{
    MaxTop = 1
});

к моему заводскому методу, то запрос с $top=10 создаст прекрасно выглядящее исключение, ведущее к ответу 400,Это моя цель.

Как автоматически запустить эту проверку или автоматически создать экземпляр ODataValidationSettings, используя все глобальные настройки, ранее переданные IRouteBuilder?

PS Я бы хотел избежать создания ODataValidationSettings вручную и использовать вместо этого стандартный API Odata.

1 Ответ

0 голосов
/ 24 декабря 2018

Чтобы проверить запрос, используя только глобальные параметры, передайте пустой параметр ODataValidationSettings:

queryOptions.Validate(new ODataValidationSettings());

Дополнительная информация о GitHub (я непосредственно спрашивал разработчиков OData).

PS Я до сих пор не представляю, как установить глобальный лимит по умолчанию, чтобы предотвратить выбор всех объектов из БД, если $top не было указано.Проверка по умолчанию не распространяется на этот случай.

...