gpt4 book ai didi

c# - WebApi OData 即使在设置 MaxTop 后,已超过 Top 查询的 '0' 限制

转载 作者:行者123 更新时间:2023-11-30 14:24:13 25 4
gpt4 key购买 nike

我正在使用 Microsoft.AspNet.OData v6.0.0 并希望将 MaxTop 值设置为 10 将启用 $top 查询选项。

但是,请求 URL http://localhost:23344/odata/v4/Resources?$top=10 仍然给我错误:

{"error":{"code":"","message":"The query specified in the URI is not valid. The limit of '0' for Top query has been exceeded. The value from the incoming request is '10'.","innererror":{"message":"The limit of '0' for Top query has been exceeded. The value from the incoming request is '10'.","type":"Microsoft.OData.ODataException","stacktrace":"   at System.Web.OData.Query.Validators.TopQueryValidator.Validate(TopQueryOption topQueryOption, ODataValidationSettings validationSettings)\r\n   at System.Web.OData.Query.TopQueryOption.Validate(ODataValidationSettings validationSettings)\r\n   at System.Web.OData.Query.Validators.ODataQueryValidator.Validate(ODataQueryOptions options, ODataValidationSettings validationSettings)\r\n   at System.Web.OData.Query.ODataQueryOptions.Validate(ODataValidationSettings validationSettings)\r\n   at System.Web.OData.EnableQueryAttribute.ValidateQuery(HttpRequestMessage request, ODataQueryOptions queryOptions)\r\n   at System.Web.OData.EnableQueryAttribute.ExecuteQuery(Object response, HttpRequestMessage request, HttpActionDescriptor actionDescriptor, ODataQueryContext queryContext)\r\n   at System.Web.OData.EnableQueryAttribute.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)"}}}

好像顶级查询的限制仍然为 0。

Controller

public class ResourcesController : ODataController
{
private IResourceService resourceService;
public ResourcesController(IResourceService resourceService)
{
this.resourceService = resourceService;
}

[EnableQuery(MaxTop=10)]
public IQueryable<Resource> Get()
{
return resourceService.GetResources().AsQueryable();
}
[EnableQuery]
public SingleResult<Resource> Get([FromODataUri] int key)
{
var result = resourceService.GetResources().Where(r => r.Id == key).AsQueryable();

return SingleResult.Create(result);
}
}

WebApiConfig.cs

public static void Register(HttpConfiguration config)
{
ODataConventionModelBuilder builder = new ODataConventionModelBuilder
{
Namespace = "MyNamespace",
ContainerName = "DefaultContainer"
};
builder.EntitySet<Resource>("Resources");
builder.EntityType<Resource>().Select().Count().Expand().OrderBy();
config.MapODataServiceRoute(
routeName: "ODataRoute",
routePrefix: "odata/v4",
model: builder.GetEdmModel());
}

我发现了什么

Github issue describing possible bug with behaviour of MaxTop

什么起作用

我启用的所有其他查询选项,包括 $skip

我尝试过的

this questionWebApiConfig.cs 之前设置 config.Select().Expand().Filter().OrderBy().MaxTop(null).Count(); >config.mapODataServiceRoute(...没用

[Page(MaxTop = 100)] 添加到我的 Resource 模型中,就像在同一个问题中一样。 没用

在模型上设置 [Page] 属性。来自 WebApi OData documentation “如果您设置页面属性,默认情况下它将启用 $top 且没有限制最大值”。 无效

在 Controller 上设置 [EnableQuery(PageSize=10)] 属性。来自 WebApi OData documentation “如果您设置页面属性,默认情况下它将启用 $top 且没有限制最大值”。 启用了分页但没有工作

错误表明在每种情况下顶部的限制都是 0

最佳答案

我遇到了同样的问题,发现如果您像以前那样在构建器中指定任何规则。

builder.EntitySet<Resource>("Resources");
builder.EntityType<Resource>().Select().Count().Expand().OrderBy();

属性设置的值将被覆盖并设置为 0。

如果您删除这些条目并将全局配置放在

config.Select().Expand().Filter().OrderBy().MaxTop(600).Count();

它会起作用。

您还可以像这样在构建器上使用流畅的界面来定义 MaxTop

builder.EntityType<T>().Page(100, 100);

即使您在构建器中为实体类型定义其他规则,它也会起作用。

总结

这可能是因为在 fluent builder 接口(interface)中定义一些配置时创建了新配置,并且您不能使用属性( Controller 上的 EnableQueryAttribute 和模型上的页面)。

这可能是一个错误,因为他们仍然推荐属性方法。我会将其报告为 OData 存储库中的问题。

关于c# - WebApi OData 即使在设置 MaxTop 后,已超过 Top 查询的 '0' 限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41849692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com