【问题标题】:How to return different Http Status Code in ServiceStack如何在 ServiceStack 中返回不同的 Http 状态码
【发布时间】:2020-01-23 14:05:02
【问题描述】:

您好,我是 Service Stack 的新手,想知道如何返回不同的 http 状态代码。

我需要能够返回的是:

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

有人可以帮忙吗?

【问题讨论】:

    标签: c# servicestack


    【解决方案1】:

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

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

    SetConfig(new HostConfig {
        Return204NoContentForEmptyResponse = false
    });
    

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

    自定义错误代码

    所有其他状态代码都是错误状态代码,记录在 ServiceStack 的Error Handling docs 中。

    例如一般建议返回理想的C#Exception,让ServiceStack自动返回理想的HTTP错误码。

    默认情况下 C# 异常继承自:

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

    因此,任何继承 ArgumentException 的异常(包括大部分 Fluent Validation Exceptions)都会自动返回首选的 400 BadRequest

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

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

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

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

    实现 IHasStatusCode

    除了自定义 C# 异常的 HTTP 响应体 IResponseStatusConvertible, 你也可以通过实现IHasStatusCode来自定义HTTP状态码:

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

    返回一个 HttpError

    如果您想要更精细地控制 HTTP 错误,您可以抛出返回一个 HttpError 让您自定义 Http HeadersStatus Code 和 HTTP Response body 以在线获取您想要的内容:

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

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

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

    带有自定义响应 DTO 的 HttpError

    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,
    }; 
    

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多