Я работаю над несколькими 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
?