嗨,我对服务堆栈很陌生,想知道如何返回不同的 http 状态代码。
我需要能够返回的是:
任何人都可以帮忙吗?
如果您的服务没有返回响应,例如有一个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,SerializationException或FormatException返回400 BadRequestNotImplementedException或NotSupportedException返回405 MethodNotAllowed FileNotFoundException返回404 NotFoundAuthenticationException返回401 UnauthorizedUnauthorizedAccessException返回403 ForbiddenOptimisticConcurrencyException返回409 Conflict因此,任何继承ArgumentException包括大多数Fluent Validation Exceptions 的 Exceptions都将自动返回首选的400 BadRequest。
自定义 HTTP 错误状态的其他方法包括:
您可以通过配置以下内容来更改为不同的异常类型返回的 HTTP 错误状态:
SetConfig(new HostConfig {
Return204NoContentForEmptyResponse = false
});
Run Code Online (Sandbox Code Playgroud)
除了使用IResponseStatusConvertible自定义C# 异常的 HTTP 响应
正文之外,您还可以通过实现来自定义 HTTP 状态代码IHasStatusCode:
SetConfig(new HostConfig {
MapExceptionToStatusCode = {
{ typeof(CustomUnprocessableEntityException), 422 },
{ typeof(CustomerNotFoundException), 404 },
}
});
Run Code Online (Sandbox Code Playgroud)
如果你想甚至更细粒度的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)
该HttpError也可用于返回一个更结构化的错误响应:
new HttpError(HttpStatusCode.NotFound, $"User {request.Name} does not exist");
Run Code Online (Sandbox Code Playgroud)