簡體   English   中英

如何在ServiceStack中返回不同的Http狀態碼

[英]How to return different Http Status Code in ServiceStack

嗨,我對服務堆棧很陌生,想知道如何返回不同的 http 狀態代碼。

我需要能夠返回的是:

  1. 204 - 已處理但沒有內容
  2. 400 - 錯誤的請求
  3. 404 - 未找到
  4. 422 - 驗證問題
  5. 500內部服務器錯誤

任何人都可以幫忙嗎?

如果您的 Service 沒有返回響應,例如有一個void方法或返回null ,ServiceStack 會自動返回204 No Content響應狀態。

此行為可以恢復為空的200 OK響應:

SetConfig(new HostConfig {
    Return204NoContentForEmptyResponse = false
});

請求返回空響應的 DTO 應實現IReturnVoid標記接口

自定義錯誤代碼

所有其他狀態代碼都是錯誤狀態代碼,它們記錄在 ServiceStack 的錯誤處理文檔中

例如,通常建議返回理想的 C# Exception並讓 ServiceStack 自動返回理想的 HTTP 錯誤代碼。

默認 C# 異常繼承自:

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

因此,任何繼承ArgumentException異常(包括大多數Fluent 驗證異常)都將自動返回首選的400 BadRequest

自定義 HTTP 錯誤狀態的其他方法包括:

C# 異常到 HTTP 錯誤狀態的自定義映射

您可以通過配置以下內容來更改為不同的異常類型返回的 HTTP 錯誤狀態:

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

實現 IHasStatusCode

除了使用IResponseStatusConvertible自定義 C# 異常的 HTTP 響應正文之外,您還可以通過實現IHasStatusCode自定義 HTTP 狀態代碼:

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

返回一個 HttpError

如果您想對 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");

帶有自定義響應 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,
}; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM