Если ваша служба не возвращает ответ, например, имеет метод 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,
};