[英]How to return different Http Status Code in ServiceStack
嗨,我對服務堆棧很陌生,想知道如何返回不同的 http 狀態代碼。
我需要能夠返回的是:
任何人都可以幫忙嗎?
如果您的 Service 沒有返回響應,例如有一個void
方法或返回null
,ServiceStack 會自動返回204 No Content響應狀態。
此行為可以恢復為空的200 OK響應:
SetConfig(new HostConfig {
Return204NoContentForEmptyResponse = false
});
請求返回空響應的 DTO 應實現
IReturnVoid
標記接口
所有其他狀態代碼都是錯誤狀態代碼,它們記錄在 ServiceStack 的錯誤處理文檔中。
例如,通常建議返回理想的 C# Exception
並讓 ServiceStack 自動返回理想的 HTTP 錯誤代碼。
默認 C# 異常繼承自:
ArgumentException
、 SerializationException
或FormatException
返回400 BadRequestNotImplementedException
或NotSupportedException
返回405 MethodNotAllowedFileNotFoundException
作為404 NotFound返回AuthenticationException
返回為401 UnauthorizedUnauthorizedAccessException
作為403 Forbidden返回OptimisticConcurrencyException
作為409 Conflict返回 因此,任何繼承ArgumentException
異常(包括大多數Fluent 驗證異常)都將自動返回首選的400 BadRequest 。
自定義 HTTP 錯誤狀態的其他方法包括:
您可以通過配置以下內容來更改為不同的異常類型返回的 HTTP 錯誤狀態:
SetConfig(new HostConfig {
MapExceptionToStatusCode = {
{ typeof(CustomUnprocessableEntityException), 422 },
{ typeof(CustomerNotFoundException), 404 },
}
});
除了使用IResponseStatusConvertible自定義 C# 異常的 HTTP 響應正文之外,您還可以通過實現IHasStatusCode
自定義 HTTP 狀態代碼:
public class Custom401Exception : Exception, IHasStatusCode
{
public int StatusCode => 401;
}
如果您想對 HTTP 錯誤進行更細粒度的控制,您可以拋出或返回HttpError允許您自定義Http 標頭和狀態代碼以及 HTTP 響應正文,以在網絡上獲得您想要的內容:
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,
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.