对ASP.NET Core 2.2 OData控制器操作的适当返回类型的困惑

时间:2019-05-22 13:11:20

标签: asp.net-core odata

我正在开发一些ASP.NET Core 2.2服务(通过此软件包OData v4通过https://www.nuget.org/packages/Microsoft.AspNetCore.OData公开端点)。

我见过的几乎所有示例都被编码为 like (此发布已大大简化)为

public class IncidentsController : ODataController {

  [ProducesResponseType(typeof(ODataValue<IEnumerable<Incident>>), Status200OK)]
  public async Task<IQueryable<Incident>> GetIncidents() {
    return await db.Incidents;
  }

  [ProducesResponseType(typeof(Incident), Status200OK)]
  [ProducesResponseType(Status404NotFound)]
  public async Task<SingleResult<Incident>> GetIncident(string key) {
    // results in Http 200 if found or Http 404 if not found
    return SingleResult.Create(new [] { await db.Incidents.SingleOrDefault(i => i.Id == key) }.AsQueryable());
  }

一切正常。但是,如果我希望根据业务规则返回自定义Http状态代码,就会遇到麻烦。例如,如果经过身份验证的用户没有查看特定事件的权限,我想返回Http 403 Forbidden

由于返回类型为SingleResult,所以我不能简单地执行return Forbid()。而且我不确定返回我需要的状态代码的任何其他方法(虽然将SingleResult指定为返回类型)。

我知道我可以将SingleResult替换为IActionResultActionResult<Incident>,但是我没有找到有关处理OData时是否合适的任何文档。我什至应该和Task<ActionResult<SingleResult<Incident>>>一起去吗?

什么是最佳做法?如果我开始在OData中包装返回类型,是否会失去任何东西(从ActionResult角度来看?)?

0 个答案:

没有答案