C# 如何在ASP.NET Core中使用StatusCodePagesWithRedirects时传递错误详细信息

C# 如何在ASP.NET Core中使用StatusCodePagesWithRedirects时传递错误详细信息,c#,asp.net-core,C#,Asp.net Core,我有一个ASP.NET核心应用程序,我正在尝试使用UseStatusCodePagesWithRedirects处理状态代码介于400和599之间的HTTP响应 在Startup.cs中,我添加了以下内容: app.UseStatusCodePagesWithRedirects("/Error"); “我的错误控制器”为空,但以下操作除外(从默认脚手架主控制器执行): 当我调用returnnew BadRequestResult()时,这非常有效或返回NotFound()来自我的一个控制器,但

我有一个ASP.NET核心应用程序,我正在尝试使用
UseStatusCodePagesWithRedirects
处理状态代码介于400和599之间的HTTP响应

Startup.cs
中,我添加了以下内容:

app.UseStatusCodePagesWithRedirects("/Error");
“我的错误控制器”为空,但以下操作除外(从默认脚手架主控制器执行):

当我调用
returnnew BadRequestResult()时,这非常有效
返回NotFound()来自我的一个控制器,但当我尝试返回更详细的错误(例如包含错误对象)时,永远不会调用控制器操作,而响应的主体在屏幕上显示为纯文本。例如,以下语句不会触发错误控制器:

[Route("Error")]
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
    return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
context.Result = new BadRequestObjectResult({ Errors = errors });
如果改用以下语句,则正确调用中间件:

context.Result = new BadRequestResult();
这似乎是按设计进行的,因为文档中指出,
UseStatusCodePagesWithRedirects
“检查状态代码介于400和599之间且没有正文的响应”(emphasis mine)并对此进行了备份

我想在我的错误页面上包含更多信息(如用户友好的错误消息,如果合适)但是我不知道如何使用中间件有效地传递数据,因为我试图避免我的控制器对错误的处理方式知道太多,以便逻辑可以包含在一个地方,并且以后可能会更改


是否有方法返回HTTP错误,该错误包含其他信息,但仍会被
UseStatusCodePagesWithRedirects

异常处理中间件不是这样工作的。我不确定您到底在做什么,但看起来您正试图从中间件或操作筛选器返回
BadRequest
。如果您想在那里截获一些错误,您应该简单地允许异常冒泡(或抛出一个),而不是返回响应,这样,您将保留所发生事件的上下文

在错误操作中,您可以使用HTTP功能接口来获取正在查找的数据。例如,有:

var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();

根据你正在做的事情,可能还有其他方法

var statusCodeReExecuteFeature = HttpContext.Features.Get<IStatusCodeReExecuteFeature>();
if (statusCodeReExecuteFeature != null)
{
    OriginalURL =
        statusCodeReExecuteFeature.OriginalPathBase
        + statusCodeReExecuteFeature.OriginalPath
        + statusCodeReExecuteFeature.OriginalQueryString;
}