如何在ASP.NET Web API中全局设置ODataValidationSettings属性?
如何在ASP.NET Web API中全局设置ODataValidationSettings属性
当然可以全局设置ODataValidationSettings的属性,不用在每个控制器或Action上单独配置。下面给你两种可行的方法,都能在全局OData配置阶段完成MaxNodeCount的设置:
方法1:自定义全局EnableQueryAttribute
这种方法通过扩展EnableQueryAttribute,预设好你的验证设置,然后将其注册为全局过滤器,所有OData请求都会自动应用这个配置。
public static void Register(HttpConfiguration config) { var builder = new ODataConventionModelBuilder(); // 这里添加你的实体集配置,比如: // builder.EntitySet<Product>("Products"); config.MapODataServiceRoute("odata", "odata", builder.GetEdmModel()); // 自定义全局查询特性,设置验证规则 var globalQueryAttribute = new EnableQueryAttribute { ValidationSettings = new ODataValidationSettings { MaxNodeCount = 20, // 你还可以在这里配置其他验证属性,比如MaxExpansionDepth等 } }; // 将自定义特性添加为全局过滤器 config.Filters.Add(globalQueryAttribute); // 保留原有查询选项的链式配置(可选,和全局属性不冲突) config .Select() .Expand() .Filter() .OrderBy() .MaxTop(null) .Count(); }
方法2:通过ODataRouteSettings配置全局查询规则
另一种方式是直接在OData路由配置中指定全局查询设置,适合希望把路由和查询规则绑定的场景:
public static void Register(HttpConfiguration config) { var builder = new ODataConventionModelBuilder(); // 配置实体集... // builder.EntitySet<Order>("Orders"); var edmModel = builder.GetEdmModel(); // 创建路由配置并设置查询验证规则 var routeConfig = new ODataRouteSettings { QuerySettings = new ODataQuerySettings { ValidationSettings = new ODataValidationSettings { MaxNodeCount = 20 } } }; // 使用自定义路由配置注册OData服务路由 config.MapODataServiceRoute("odata", "odata", edmModel, routeConfig); // 启用基础查询选项 config .Select() .Expand() .Filter() .OrderBy() .MaxTop(null) .Count(); }
小提示
- 如果你的控制器Action上单独使用了
[EnableQuery]特性,全局配置会被局部配置覆盖。如果想强制全局规则生效,可以移除局部的[EnableQuery],或者在自定义EnableQueryAttribute时重写优先级逻辑。 MaxNodeCount的作用是限制OData查询表达式的复杂度,防止恶意构造的复杂拖慢服务,建议根据你的业务场景设置合理数值。
内容的提问来源于stack exchange,提问作者mykhailo.romaniuk
相关产品推荐
相关产品推荐

