2 回答
TA贡献1798条经验 获得超3个赞
对我来说正确的答案是UseStatusCodePagesWithReExecute在 Startup.cs 中使用 plain ,但在错误控制器中改变处理方式。这使我可以返回纯文本内容以显示 API 错误,但为用户保留友好的视图。
启动.cs
app.UseStatusCodePagesWithReExecute("/error/{0}");
错误控制器:
[HttpGet("error/{statusCode:int}")]
public IActionResult Error(int statusCode)
{
var statusCodeFeature = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
var exceptionDataFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
// ... Other logging and stuff
IActionResult actionResult;
if (statusCodeFeature == null || statusCodeFeature.OriginalPath.StartsWith("/api", StringComparison.InvariantCultureIgnoreCase))
{
actionResult = Content($"The request could not be processed: {statusCode.ToString(CultureInfo.InvariantCulture)}");
}
else
{
ViewBag.StatusCode = statusCode;
actionResult = View();
}
return actionResult;
}
TA贡献1875条经验 获得超5个赞
这在某种程度上取决于解释,但我会说评论只是暗示某些东西可能会禁用该功能,但默认情况下并不是任何东西实际上会起作用。
我认为没有任何明显更清洁的东西 - 你有什么是有道理的,但另一种选择是使用一个自定义中间件来关闭该功能。这可能是这样的:
public void Configure(IApplicationBuilder app)
{
// ...
app.UseStatusCodePagesWithReExecute("/.../{0}");
app.Use(async (ctx, next) =>
{
if (ctx.Request.Path.Value.StartsWith("/api", StringComparison.OrdinalIgnoreCase))
{
var statusCodeFeature = ctx.Features.Get<IStatusCodePagesFeature>();
if (statusCodeFeature != null && statusCodeFeature.Enabled)
statusCodeFeature.Enabled = false;
}
await next();
});
// ...
app.UseMvc();
// ...
}
- 2 回答
- 0 关注
- 250 浏览
添加回答
举报
