在2.1和2.2版本中,ASP.NET Core添加了一個(gè)名為“問(wèn)題詳細(xì)信息”的功能,它將幫助您標(biāo)準(zhǔn)化API控制器中的錯(cuò)誤消息。在2.2中,文件新項(xiàng)目默認(rèn)為使用“[ApiController]”屬性從控制器拋出的錯(cuò)誤啟用“問(wèn)題詳細(xì)信息”。另外,在nuget包Hellang.Middleware.ProblemDetails的幫助下,您可以在API控制器之外的404和500錯(cuò)誤中添加這些相同的錯(cuò)誤。因此,通過(guò)升級(jí)到2.2和nuget包,您的API可以將所有錯(cuò)誤標(biāo)準(zhǔn)化為已定義的規(guī)范(RFC 7807)。:)
以下是關(guān)于我能找到的主題的官方發(fā)行說(shuō)明。
ASP.NET Core 2.1問(wèn)題詳細(xì)信息支持
ASP.NET Core 2.2發(fā)布了有關(guān)問(wèn)題詳細(xì)信息的說(shuō)明
從2.0升級(jí)到2.2并使用問(wèn)題詳細(xì)信息
如果要將現(xiàn)有站點(diǎn)升級(jí)到2.2并想要使用問(wèn)題詳細(xì)信息,則需要添加以下代碼。您還可以執(zhí)行文件新項(xiàng)目并從啟動(dòng)中復(fù)制這些值。在3.0中,他們可能會(huì)刪除這些兼容性開(kāi)關(guān)。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
然后確保您的控制器使用“ApiController”屬性。他們?cè)?.2中添加的另一個(gè)很酷的事情是你可以將ApiController移動(dòng)到一個(gè)程序集,所以你不必將它添加到每個(gè)控制器。
在ASP.NET Core 2.2或更高版本中,[ApiController]屬性可以應(yīng)用于程序集。以這種方式的注釋將Web API行為應(yīng)用于程序集中的所有控制器。請(qǐng)注意,沒(méi)有辦法選擇退出單個(gè)控制器。
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
現(xiàn)在,如果您發(fā)出導(dǎo)致驗(yàn)證錯(cuò)誤的請(qǐng)求,您應(yīng)該看到如下內(nèi)容:
通過(guò)向文件新項(xiàng)目API模板/ api / values / foo中包含的值控制器發(fā)出請(qǐng)求而生成錯(cuò)誤。
{
"errors": {
"id": [
"The value 'foo' is not valid."
]
},
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "0HLJIMARUILN4:00000001"
}
對(duì)400和500錯(cuò)誤使用問(wèn)題詳細(xì)信息
現(xiàn)在,如果您嘗試發(fā)出未觸及控制器的404請(qǐng)求,則無(wú)法獲得問(wèn)題詳細(xì)信息。更多信息為什么ASP.NET默認(rèn)情況下不包括它。404NotFound和500Exception不返回ProblemDetails。要解決此問(wèn)題,您可以安裝此nuget插件Hellang.Middleware.ProblemDetails。以下是安裝后如何在Startup.cs中配置它的示例。
public void ConfigureServices(IServiceCollection services)
{
// Hellang.Middleware.ProblemDetails package
services.AddProblemDetails();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseProblemDetails();