ASP.NET WebAPI ODataController始终返回406不被接受

时间:2015-04-21 17:22:12

标签: c# .net odata

我正在为我的应用程序OData控制器实现通用基本控制器。这个控制器的方法如下:

[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之类的内容,这实际上会修改实体本身。这是因为在应用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);
}

现在,每次调用此控制器操作都会返回HTTP状态代码406(不可接受),无论我是否使用$ expand / $ select。

实体是一个List,当它传递给Ok()时,这可能是问题吗? ODataContentFormatter是否存在List问题?那么你应该如何归还这种结果?

2 个答案:

答案 0 :(得分:0)

启用$ select和$ expand你应该返回可查询的内容,这样你就需要继续返回IQueryable。

你的行动应该是这样的

[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();

    // ...
}

答案 1 :(得分:0)

确保您的创业中有以下内容:

$validator = Validator::make($request->all(), [
        'email' => 'required|unique:users',
        'password' => 'required'
        ]);