【发布时间】:2019-07-15 18:18:49
【问题描述】:
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。
【问题讨论】:
-
您在这里提出的两个问题有不同的解决方案 (imo)。我添加了一个解决 410 问题的答案,但您拥有的另一个答案(在撰写本文时)解决了 500 问题。我认为在我给出的答案中解决第二个问题没有多大意义,因为它通常只是重复另一个答案的第二半(我会去不返回明确的 500s,而是使用异常和内置异常处理程序的东西,但这只是我的意见)。
标签: c# asp.net-core asp.net-core-webapi