![](/img/trans.png)
[英]How do I configure validation error details return content-type as application/problem+json instead of application/json?
[英].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
值不同,並且title
和traceId
字段丟失。
我還想為HTTP 500響應創建一個自定義類,其中包括帶有錯誤消息的message
字段。 我嘗試返回StatusCode(StatusCodes.Status500InternalServerError)
,這給了我與Gone()
方法相同的最小application/problem+json
響應; 我也嘗試過返回StatusCode(StatusCodes.Status500InternalServerError, message)
,這給了我我的錯誤消息,但是將響應格式設置為text/plain
。
生成ProblemDetails
響應的代碼不知道410
狀態代碼,因此在構建響應對象時沒有關聯的Link
和Title
屬性。 為了增加這種認識, ApiBehaviorOptions
在ConfigureServices
配置ApiBehaviorOptions
,如下所示:
services.Configure<ApiBehaviorOptions>(options =>
{
options.ClientErrorMapping[410] = new ClientErrorData
{
Title = "Gone",
Link = "https://tools.ietf.org/html/rfc7231#section-6.5.9"
};
});
ClientErrorMapping
是int
(狀態代碼)到ClientErrorData
。 請注意,我上面用於Link
的值的確指向RFC的正確部分。
簡單來說,您必須實際返回ProblemDetails
響應主體。 我必須仔細研究代碼才能確定,但是我認為ASP.NET Core僅通過中間件來實現特定結果。 他們說的是4xx范圍內的任何內容,但我認為實際上只限於返回該范圍內狀態代碼的內置結果類型,而不是任何帶有4xx狀態代碼的結果。 同樣,這是一種推測,因為我沒有確切地看他們在做什么,盡管這並不是實際結果類的一部分。
為了您的目的,有幾種不同的方法可以處理此問題。 您可以編寫自己的中間件來捕獲出站響應並重寫它們。 您可以使用自定義異常處理程序。 您可以直接從ObjectResult
繼承,然后自己創建一個ProblemDetails
實例並將其放入基礎中。 您甚至可以直接從操作中直接返回ProblemDetails
(盡管,這顯然是最不理想的方式)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.