Я бы хотел отклонить запрос 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.