如果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
实例?
P.S。我想避免手动创建ODataValidationSettings
,而改用标准的Odata API。
答案 0 :(得分:0)
要仅使用全局选项来验证查询,请传递一个空的ODataValidationSettings
参数:
queryOptions.Validate(new ODataValidationSettings());
有关GitHub的更多信息(我直接问过OData开发人员)。
P.S。我仍然不知道如何设置默认的全局限制,以防止在未指定$top
的情况下从数据库中选择所有实体。默认验证不涵盖这种情况。