gpt4 book ai didi

c# - 在 WebApi ApiController 上启用 OData v4 查询

转载 作者:行者123 更新时间:2023-11-30 12:58:53 24 4
gpt4 key购买 nike

我正在努力将 OData v4 查询支持添加到继承自 ApiController 而不是 ODataController 的 Controller 上的方法。虽然我在解决方案中有一个有效的 OData 模型,但有些端点并不真正属于该模型,但查询的功能会很有用。

我看到一些文章建议我可以只返回一个 IQueryable 并使用 EnableQuery。

这是我的示例代码:

public class TestController : ApiController
{
[HttpGet]
[EnableQuery]
public IQueryable<TestObject> Events()
{
var result = new[] { new TestObject { Id = "1" } }.AsQueryable();
return result;
}
}

public class TestObject
{
public string Id { get; set; }
}

当调用/Test/Events 是 406 Not Acceptable 时,我得到的所有结果都是我在处理 OData 时遇到的,这通常意味着我返回了 OData 框架不喜欢的东西。我从来没有能够从框架中获得更多信息(我认为这是一个主要的失败)关于为什么它不喜欢它并且只能通过过去的反复试验来解决它们。

有人让这个设置正常工作吗?如果是的话,怎么做的?

或者关于调试 406 响应的任何建议?

编辑:

好吧,原来罪魁祸首是在启动时注册自定义 ODataMediaTypeFormatter 并在此过程中清除所有其他格式化程序的代码。

删除有问题的代码后,它起作用了。

真的很希望 WebApi 在吐出 406 错误时能在某处记录下是什么原因导致的。

最佳答案

您可以手动应用“查询”魔法,无需 [EnableQuery]。

  1. 创建一个 ODataQueryContext,传入您的模型(您需要将其保存在全局并使其可用),以及您的实体类型查询。
  2. 使用 Get 和当前 url 创建一个 HttpRequestMessage(Request.RequestUri.AbsoluteUri)。
  3. 创建一个新的 ODataQueryOptions ,传入上下文和请求您创建的消息。
  4. 使用您的 entity.AsQueryable() 调用该对象的 ApplyTo,转换作为 IQueryable 的结果。

需要进一步操作并返回。请记住,返回类型不需要是 IQueryable ,甚至不需要基于“yourEntity”。

这是一个类似的实现,它针对 ODataController 方法执行此操作(作为免费提供的基础 ODataQueryOptions):

        public IEnumerable<Aggregate> GetOrders(ODataQueryOptions<ReportingOrder> opts, [FromUri(Name="$groupby")]string groupby, [FromUri(Name="$aggregates")]string aggregates = null)
{
var url = opts.Request.RequestUri.AbsoluteUri;


int? top = null;

if (opts.Top != null)
{
top = int.Parse(opts.Top.RawValue);

var topStr = string.Format("$top={0}", top.Value);
url = url.Replace(topStr, "");
var req = new HttpRequestMessage(HttpMethod.Get, url);

opts = new ODataQueryOptions<ReportingOrder>(opts.Context, req);

}

var query = opts.ApplyTo(db.ReportingOrders.AsQueryable()) as IQueryable<ReportingOrder>;

var results = query.GroupBy(groupby, aggregates, top);

return results;
}

关于c# - 在 WebApi ApiController 上启用 OData v4 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28044640/

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