Путаница с подходящим типом возврата для действий контроллера ASP.NET Core 2.2 OData - PullRequest
0 голосов
/ 22 мая 2019

Я работаю над несколькими ASP.NET Core 2.2 службами, которые предоставляют OData v4 (через этот пакет https://www.nuget.org/packages/Microsoft.AspNetCore.OData) конечные точки.

Почти все примеры, которые я видел, имеют кодировку , похожую (значительно упрощенную для этой публикации) на

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?

...