2 回答

TA貢獻1798條經(jīng)驗 獲得超3個贊
對我來說正確的答案是UseStatusCodePagesWithReExecute在 Startup.cs 中使用 plain ,但在錯誤控制器中改變處理方式。這使我可以返回純文本內(nèi)容以顯示 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條經(jīng)驗 獲得超5個贊
這在某種程度上取決于解釋,但我會說評論只是暗示某些東西可能會禁用該功能,但默認情況下并不是任何東西實際上會起作用。
我認為沒有任何明顯更清潔的東西 - 你有什么是有道理的,但另一種選擇是使用一個自定義中間件來關(guān)閉該功能。這可能是這樣的:
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 關(guān)注
- 175 瀏覽
添加回答
舉報