Как вернуть другой код статуса Http в ServiceStack - PullRequest
1 голос
/ 23 января 2020

Привет, я новичок в Service Stack и мне интересно, как я могу вернуть другой код статуса http.

Мне нужно вернуть следующие коды:

  1. 204 - обработано, но без содержимого
  2. 400 - неверный запрос
  3. 404 - не найдено
  4. 422 - для проблем проверки
  5. 500 - внутренняя ошибка сервера

Может ли кто-нибудь помочь?

1 Ответ

3 голосов
/ 23 января 2020

Если ваша служба не возвращает ответ, например, имеет метод void или возвращает null, ServiceStack автоматически возвращает 204 Нет содержимого статус ответа.

Это поведение можно вернуть к пустому ответу 200 OK с:

SetConfig(new HostConfig {
    Return204NoContentForEmptyResponse = false
});

Запросить DTO, возвращающие пустые ответы, должен реализован интерфейс маркера IReturnVoid

Пользовательские коды ошибок

Все остальные коды состояния являются кодами ошибок, которые описаны в документах ServiceStack Обработка ошибок .

Например, обычно рекомендуется возвращать идеальный C# Exception, и ServiceStack автоматически возвращает идеальный код HTTP-ошибки.

По умолчанию C# Исключения, наследуемые от:

  • ArgumentException, SerializationException или FormatException возвращает 400 BadRequest
  • NotImplementedException или NotSupportedException возвращает 405 MethodNotAllowed
  • FileNotFoundException возвращается как 404 NotFound
  • AuthenticationException возвращается как 401 Unauthorized
  • UnauthorizedAccessException возвращается as 403 Forbidden
  • OptimisticConcurrencyException возвращается как 409 Conflict
  • All Other normal C# Исключения возвращаются как 500 InternalServerError

Таким образом, любые исключения, унаследованные ArgumentException, которые включают большинство Свободных исключений проверки , автоматически вернут предпочтительный 400 BadRequest .

Другие способы настройки статусов ошибок HTTP включают:

Настраиваемое сопоставление C# Исключения в статус ошибки HTTP

Вы можете изменить статус ошибки HTTP, возвращаемый для различных типов исключений, настроив их с помощью:

SetConfig(new HostConfig { 
    MapExceptionToStatusCode = {
        { typeof(CustomUnprocessableEntityException), 422 },
        { typeof(CustomerNotFoundException), 404 },
    }
});

Реализация IHasStatusCode

В дополнение к настройке Тело HTTP-ответа C# Исключения с IResponseStatusConvertible , вы также можете настроить код состояния HTTP, реализовав IHasStatusCode:

public class Custom401Exception : Exception, IHasStatusCode
{
    public int StatusCode => 401;
}

Возвращая HttpError

Если Вы хотите еще более точный контроль над своими ошибками HTTP, вы можете либо throw или return an HttpError , позволяя настраивать Http Headers и Код состояния и HTTP-ответ тело , чтобы получить именно то, что вы хотите по кабелю:

public object Get(User request) 
{
    throw HttpError.NotFound($"User {request.Name} does not exist");
}

Приведенное выше возвращает 404 NotFound StatusCode on провод и является сокращением для:

new HttpError(HttpStatusCode.NotFound, $"User {request.Name} does not exist");

HttpError с пользовательским ответом DTO

HttpError также можно использовать для возврата более структурированного ответа об ошибке с:

var responseDto = new ErrorResponse { 
    ResponseStatus = new ResponseStatus {
        ErrorCode = typeof(ArgumentException).Name,
        Message = "Invalid Request",
        Errors = new List<ResponseError> {
            new ResponseError {
                ErrorCode = "NotEmpty",
                FieldName = "Company",
                Message = "'Company' should not be empty."
            }
        }
    }
};

throw new HttpError(HttpStatusCode.BadRequest, "ArgumentException") {
    Response = responseDto,
}; 
...