簡體   English   中英

.NET Core Web API:使用內容類型application / problem + json返回自定義HTTP狀態代碼

[英].NET Core Web API: return a custom HTTP status code with Content Type application/problem+json

ControllerBase包含諸如Conflict()方法,這些方法返回從StatusCodeResult派生的ConflictResult對象(表示HTTP 409響應)。 結果響應主體的內容類型為application/problem+json ,如下所示:

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.8",
    "title": "Conflict",
    "status": 409,
    "traceId": "0HLO99QHFC9QI:00000001"
}

HTTP 410響應沒有內置的方法/類,因此我做了一個:

[DefaultStatusCode(410)]
public class GoneResult : StatusCodeResult
{
    public GoneResult() : base(410)
    {}
}
...
public static class ControllerBaseExtensions
{
    public static GoneResult Gone(this ControllerBase controllerBase) // this doesn't give all the problem+JSON attributes
    {
        return new GoneResult();
    }
}

但是,這給

{
    "type": "about:blank",
    "status": 410
}

即, type值不同,並且titletraceId字段丟失。

我還想為HTTP 500響應創建一個自定義類,其中包括帶有錯誤消息的message字段。 我嘗試返回StatusCode(StatusCodes.Status500InternalServerError) ,這給了我與Gone()方法相同的最小application/problem+json響應; 我也嘗試過返回StatusCode(StatusCodes.Status500InternalServerError, message) ,這給了我我的錯誤消息,但是將響應格式設置為text/plain

生成ProblemDetails響應的代碼不知道410狀態代碼,因此在構建響應對象時沒有關聯的LinkTitle屬性。 為了增加這種認識, ApiBehaviorOptionsConfigureServices配置ApiBehaviorOptions ,如下所示:

services.Configure<ApiBehaviorOptions>(options =>
{
    options.ClientErrorMapping[410] = new ClientErrorData
    {
        Title = "Gone",
        Link = "https://tools.ietf.org/html/rfc7231#section-6.5.9"
    };
});

ClientErrorMappingint (狀態代碼)到ClientErrorData 請注意,我上面用於Link的值的確指向RFC的正確部分。

簡單來說,您必須實際返回ProblemDetails響應主體。 我必須仔細研究代碼才能確定,但​​是我認為ASP.NET Core僅通過中間件來實現特定結果。 他們的是4xx范圍內的任何內容,但我認為實際上只限於返回該范圍內狀態代碼的內置結果類型,而不是任何帶有4xx狀態代碼的結果。 同樣,這是一種推測,因為我沒有確切地看他們在做什么,盡管這並不是實際結果類的一部分。

為了您的目的,有幾種不同的方法可以處理此問題。 您可以編寫自己的中間件來捕獲出站響應並重寫它們。 您可以使用自定義異常處理程序。 您可以直接從ObjectResult繼承,然后自己創建一個ProblemDetails實例並將其放入基礎中。 您甚至可以直接從操作中直接返回ProblemDetails (盡管,這顯然是最不理想的方式)。

暫無
暫無

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

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