SelfHosting ApiController, как возвращать ошибки

Я использовал подобные примеры для создания контроллера API самообслуживания. Он может HttpPost и HttpGet Customer объект.

(Упрощенная) функция для получения Customer по идентификатору:

[RoutePrefix("test")]
public class MyTestController : ApiController
{
    [Route("getcustomer")]
    [HttpGet]
    public Customer GetCustomer(int customerId)
    {    // as a test: react as if this customer exists:
         return new Customer()
         {
              Id = customerId,
              Name = "John Doe",
         };     
    }
    ...
}

Это прекрасно работает. На моей стороне клиента я могу запросить у этого тестового сервера клиента по идентификатору, и я получаю клиента с ожидаемыми данными.

Очевидно, вызывающая функция знает, как обернуть моего возвращенного клиента в объект (HttpResponseMessage?), который можно передать моему клиенту.

Следующий шаг: вернуть ошибку 404, если клиент не найден.

[Route("getcustomer")]
[HttpGet]
public Customer GetCustomer(int customerId)
{    // as a test: only customer 1 exists
     if (customerId == 1)
     {
         return new Customer()
         {
              Id = customerId,
              Name = "John Doe",
         };   
      }
      else
      {
           // TODO: make sure 404 Err not found returned.
      }
}

Как это сделать? Выбросить исключение? Вызвать одну из функций WebApi, чтобы сообщить, что ошибка 404 должна быть возвращена вместо моего возвращенного клиента?


person Harald Coppoolse    schedule 09.01.2018    source источник


Ответы (2)


Вместо этого верните IHttpActionResult:

[Route("getcustomer")]
[HttpGet]
public IHttpActionResult GetCustomer(int customerId)
{    // as a test: only customer 1 exists
    if (customerId == 1)
    {
        return Ok(new Customer()
        {
            Id = customerId,
            Name = "John Doe",
        });
    }

    // TODO: make sure 404 Err not found returned.
    return NotFound();
}
person peco    schedule 09.01.2018

Вы можете изменить возвращаемое значение на IHttpActionResult и вернуть либо System.Web.Http.Results.OkResult или System.Web.Http.Results.NotFoundResult

Однако более простое решение, похожее на то, что вы обычно делаете, — создать исключение System.Web.Http.HttpResponseException..

Конструктор принимает System.Net .HttpStatusCode. Исключение перехватывается вызывающим абонентом и преобразуется в соответствующий ответ.

[Route("getcustomer")]
[HttpGet]
public Customer GetCustomer(int customerId)
{    // as a test: only customer 1 exists
    if (customerId == 1)
    {

    };   
    else
    {
       throw new HttpResponseException(System.Net.HttpStatusCode.NotFound);
    }
}
person Harald Coppoolse    schedule 09.01.2018