【发布时间】:2020-01-23 14:05:02
【问题描述】:
您好,我是 Service Stack 的新手,想知道如何返回不同的 http 状态代码。
我需要能够返回的是:
- 204 - 已处理但没有内容
- 400 - 错误请求
- 404 - 未找到
- 422 - 用于验证问题
- 500 - 内部服务器错误
有人可以帮忙吗?
【问题讨论】:
标签: c# servicestack
您好,我是 Service Stack 的新手,想知道如何返回不同的 http 状态代码。
我需要能够返回的是:
有人可以帮忙吗?
【问题讨论】:
标签: c# servicestack
如果您的服务没有返回响应,例如有void方法或返回null,ServiceStack自动返回204 No Content响应状态。
此行为可以恢复为空的 200 OK 响应:
SetConfig(new HostConfig {
Return204NoContentForEmptyResponse = false
});
返回空响应的请求 DTO 应实现
IReturnVoid标记接口
所有其他状态代码都是错误状态代码,记录在 ServiceStack 的Error Handling docs 中。
例如一般建议返回理想的C#Exception,让ServiceStack自动返回理想的HTTP错误码。
默认情况下 C# 异常继承自:
ArgumentException、SerializationException 或 FormatException 返回 400 BadRequest
NotImplementedException 或 NotSupportedException 返回 405 MethodNotAllowed FileNotFoundException 返回为 404 NotFound
AuthenticationException 返回为 401 Unauthorized
UnauthorizedAccessException 返回为 403 Forbidden
OptimisticConcurrencyException 返回为 409 冲突
因此,任何继承 ArgumentException 的异常(包括大部分 Fluent Validation Exceptions)都会自动返回首选的 400 BadRequest。
自定义 HTTP 错误状态的其他方法包括:
您可以通过配置不同的异常类型来更改返回的 HTTP 错误状态:
SetConfig(new HostConfig {
MapExceptionToStatusCode = {
{ typeof(CustomUnprocessableEntityException), 422 },
{ typeof(CustomerNotFoundException), 404 },
}
});
除了自定义 C# 异常的 HTTP 响应体
IResponseStatusConvertible,
你也可以通过实现IHasStatusCode来自定义HTTP状态码:
public class Custom401Exception : Exception, IHasStatusCode
{
public int StatusCode => 401;
}
如果您想要更精细地控制 HTTP 错误,您可以抛出或返回一个 HttpError 让您自定义 Http Headers 和 Status 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");
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,
};
【讨论】: