Вернуть разные коды состояния HTTP из службы приложений - PullRequest
0 голосов
/ 07 мая 2019

Я использую ASP.NET Boilerplate Framework и создал пользовательский сервис приложений, который наследуется от AsyncCrudAppServiceBase, и переопределил функцию Get.

public override async Task<ExampleDto> Get(EntityDto<int> input)
{
    var example = await Repository.GetAll().FirstOrDefault(x => x.Id == input.Id);

    return ObjectMapper.Map<ExampleDto>(example);
}

Однако, поскольку я использую FirstOrDefault, если запись не существует, она возвращает null и HTTP-статус 200 вместо 404, что я хочу.

Если я изменю функцию LINQ на First или, в идеале, Single, тогда генерируется исключение, но HTTP-статус равен 500.

Я могу проверить, существует ли запись, но как мне вернуть другой статус HTTP из службы приложений?

1 Ответ

1 голос
/ 07 мая 2019

Вам следует рассмотреть возможность использования метода get из репозитория в службе приложения.

См. https://aspnetboilerplate.com/Pages/Documents/Repositories#base-repository-methods

Причина, по которой Repository.Get() выдает EntityNotFoundException, когда FirstOrDefault возвращает ноль.

См. https://github.com/aspnetboilerplate/aspnetboilerplate/blob/6bce9a0572170e8daf1b21ee982a869714579e2d/src/Abp/Domain/Repositories/AbpRepositoryBase.cs#L73-L82

И когда Abp упаковывает ответ, EntityNotFoundException будет иметь NotFound как HttpStatusCode

См. https://github.com/aspnetboilerplate/aspnetboilerplate/blob/15e5f33885442bfd0996936191fd964144a95652/src/Abp.AspNetCore/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs#L99-L102

...