如何在ServiceStack中返回不同的Http状态码

Ste*_*ove 2 c# servicestack

嗨,我对服务堆栈很陌生,想知道如何返回不同的 http 状态代码。

我需要能够返回的是:

  1. 204 - 已处理但没有内容
  2. 400 - 错误的请求
  3. 404 - 未找到
  4. 422 - 验证问题
  5. 500内部服务器错误

任何人都可以帮忙吗?

myt*_*thz 7

如果您的服务没有返回响应,例如有一个void方法或返回null,ServiceStack 会自动返回一个204 No Content响应状态。

此行为可以恢复为空的200 OK响应:

SetConfig(new HostConfig {
    Return204NoContentForEmptyResponse = false
});
Run Code Online (Sandbox Code Playgroud)

请求返回空响应的 DTO 应实现IReturnVoid标记接口

自定义错误代码

所有其他状态代码都是错误状态代码,它们记录在 ServiceStack 的错误处理文档中

例如,通常建议返回理想的 C#Exception并让 ServiceStack 自动返回理想的 HTTP 错误代码。

默认 C# 异常继承自:

  • ArgumentException,SerializationExceptionFormatException返回400 BadRequest
  • NotImplementedExceptionNotSupportedException返回405 MethodNotAllowed
  • FileNotFoundException返回404 NotFound
  • AuthenticationException返回401 Unauthorized
  • UnauthorizedAccessException返回403 Forbidden
  • OptimisticConcurrencyException返回409 Conflict
  • 所有其他正常的 C# 异常都返回为500 InternalServerError

因此,任何继承ArgumentException包括大多数Fluent Validation Exceptions 的 Exceptions都将自动返回首选的400 BadRequest

自定义 HTTP 错误状态的其他方法包括:

C# 异常到 HTTP 错误状态的自定义映射

您可以通过配置以下内容来更改为不同的异常类型返回的 HTTP 错误状态:

SetConfig(new HostConfig {
    Return204NoContentForEmptyResponse = false
});
Run Code Online (Sandbox Code Playgroud)

实现 IHasStatusCode

除了使用IResponseStatusConvertible自定义C# 异常的 HTTP 响应 正文之外,您还可以通过实现来自定义 HTTP 状态代码IHasStatusCode

SetConfig(new HostConfig { 
    MapExceptionToStatusCode = {
        { typeof(CustomUnprocessableEntityException), 422 },
        { typeof(CustomerNotFoundException), 404 },
    }
});
Run Code Online (Sandbox Code Playgroud)

返回一个 HttpError

如果你想甚至更细粒度的HTTP错误的控制,你可以扔掉退回HttpError让你自定义HTTP标头状态代码和HTTP响应,以获得真正想要的是什么线:

public class Custom401Exception : Exception, IHasStatusCode
{
    public int StatusCode => 401;
}
Run Code Online (Sandbox Code Playgroud)

以上在线路上返回一个404 NotFound StatusCode 并且是以下内容的简写:

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

带有自定义响应 DTO 的 HttpError

HttpError也可用于返回一个更结构化的错误响应:

new HttpError(HttpStatusCode.NotFound, $"User {request.Name} does not exist");
Run Code Online (Sandbox Code Playgroud)