gpt4 book ai didi

c# - ASP.NET WebAPI ODataController 总是返回 406 不被接受

转载 作者:太空宇宙 更新时间:2023-11-03 15:42:21 26 4
gpt4 key购买 nike

我正在为我的应用程序 OData Controller 实现一个通用基础 Controller 。这个 Controller 有一个像这样的方法:

[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public virtual async Task<IHttpActionResult> Get(ODataQueryOptions<TEntity> options)
{
var source = db.Set<TEntity>().Where(e => !e.IsDeleted);
var queryable = (IQueryable<TEntity>)options.ApplyTo(source);

var entities = await queryable.ToListAsync();
return Ok(entities);
}

在您尝试使用 $expand 或 $select 之类的东西之前,此 Controller 操作工作得很好,它们实际上修改了实体本身。这是因为在应用 ODataQueryOptions 之后,我们不能确定我们仍然有一个 IQueryable。

为了解决这个问题,我删除了对 IQueryable 的转换:

[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public virtual async Task<IHttpActionResult> Get(ODataQueryOptions<TEntity> options)
{
var source = db.Set<TEntity>().Where(e => !e.IsDeleted);
var queryable = options.ApplyTo(source);

var entities = await queryable.ToListAsync();
return Ok(entities);
}

现在,无论我是否使用 $expand/$select,每次调用此 Controller 操作都会返回 HTTP 状态代码 406( Not Acceptable )。

实体在传递给 Ok() 时是一个列表,这可能是问题所在吗? ODataContentFormatter 与 List 有问题吗?那么你应该如何返回这种结果呢?

最佳答案

要启用 $select 和 $expand,您应该返回可查询对象,因此您需要继续返回 IQueryable。

你的 Action 应该是这样的

[Queryable]
[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public virtual async Task<IHttpActionResult> Get(ODataQueryOptions<TEntity> options)
{
var source = db.Set<TEntity>().Where(e => !e.IsDeleted);
var queryable = options.ApplyTo(source);

var entities = await queryable.ToListAsync();
return Ok(entities);
}

要全局启用 OData 查询选项,请在启动时在 HttpConfiguration 类上调用 EnableQuerySupport:

public static void Register(HttpConfiguration config)
{
// ...

config.EnableQuerySupport();

// ...
}

关于c# - ASP.NET WebAPI ODataController 总是返回 406 不被接受,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29779080/

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