我正在开发一些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
替换为IActionResult
或ActionResult<Incident>
,但是我没有找到有关处理OData
时是否合适的任何文档。我什至应该和Task<ActionResult<SingleResult<Incident>>>
一起去吗?
什么是最佳做法?如果我开始在OData
中包装返回类型,是否会失去任何东西(从ActionResult
角度来看?)?