您好,我是 Service Stack 的新手,想知道如何返回不同的 http 状态代码。
我需要能够返回的是:
有人可以帮忙吗?
最佳答案
如果您的服务没有返回响应,例如有一个void
方法或返回null
,ServiceStack自动返回一个204 No Content响应状态。
此行为可以恢复为空的 200 OK 响应:
SetConfig(new HostConfig {
Return204NoContentForEmptyResponse = false
});
Request DTOs returning empty responses should implement the
IReturnVoid
marker interface
所有其他状态代码都是错误状态代码,记录在 ServiceStack 的 Error Handling docs 中.
例如通常建议返回理想的 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 的大部分将自动返回首选的 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,
};
https://stackoverflow.com/questions/59870825/