C# 将异常传递给默认的ASP.Net核心错误处理程序

C# 将异常传递给默认的ASP.Net核心错误处理程序,c#,asp.net,asp.net-mvc,asp.net-core,C#,Asp.net,Asp.net Mvc,Asp.net Core,我在VS Community 2019的新版本中使用ASP.NET CORE 3.1项目 在我的startup.cs文件中的Configure(IApplicationBuilder应用程序,IWebHostEnvironment环境)中,我有一行: app.UseExceptionHandler("/Home/Error"); 因此,当我在控制器的某个地方抛出错误时 throw new Exception("User Not Found!"); 然后

我在VS Community 2019的新版本中使用ASP.NET CORE 3.1项目

在我的
startup.cs
文件中的
Configure(IApplicationBuilder应用程序,IWebHostEnvironment环境)
中,我有一行:

app.UseExceptionHandler("/Home/Error");
因此,当我在
控制器的某个地方抛出错误时

throw new Exception("User Not Found!");
然后在
HomeController
中返回到默认的
IActionResult

[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
    return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
我希望向
IActionResult Error()
传递一些信息(异常
或其消息),但我不确定这是否可行

于是我想

是否可以从
错误IActionResult
访问
BaseController
中抛出的
异常
?可能通过使用
HttpContext
活动


使用intellisense,我似乎找不到任何东西,不确定我的方法是否正确,可能需要设置一个全新的错误处理系统。

也许你应该添加错误处理中间件

app.UseMiddleware<ErrorHandlingMiddleware>();

public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate next;

    private readonly ILogger _logger;
    public ErrorHandlingMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
    {
        this.next = next; 
        _logger = loggerFactory.CreateLogger<ErrorHandlingMiddleware>();
    }

    public async Task Invoke(HttpContext context /* other dependencies */)
    {
        try
        {
            await next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception ex)
    {
        var code = HttpStatusCode.InternalServerError; // 500 if unexpected

        if (ex is AuthenticationException)
        {
            code = HttpStatusCode.Unauthorized;
        }
        var result = JsonConvert.SerializeObject(new
        {
            Status = "Error",
            ErrorCode = (int)code,
            ErrorMessage = ex.Message,
        });
        context.Response.ContentType = "application/json";
        context.Response.StatusCode = (int)code;
        return context.Response.WriteAsync(result);
    }
}
app.UseMiddleware();
公共类错误处理中间件
{
私有只读请求委托下一步;
专用只读ILogger\u记录器;
公共错误处理中间件(RequestDelegate next,iLogger工厂loggerFactory)
{
this.next=next;
_logger=loggerFactory.CreateLogger();
}
公共异步任务调用(HttpContext上下文/*其他依赖项*/)
{
尝试
{
等待下一个(上下文);
}
捕获(例外情况除外)
{
等待HandleExceptionAsync(上下文,例如);
}
}
私有静态任务HandleExceptionAsync(HttpContext上下文,异常ex)
{
var code=HttpStatusCode.InternalServerError;//500如果意外
如果(ex是AuthenticationException)
{
代码=HttpStatusCode。未经授权;
}
var result=JsonConvert.SerializeObject(新
{
Status=“Error”,
ErrorCode=(int)代码,
ErrorMessage=例如消息,
});
context.Response.ContentType=“应用程序/json”;
context.Response.StatusCode=(int)代码;
返回context.Response.WriteAsync(结果);
}
}

您可以使用动作过滤器。关于更多细节,请参考这篇文章,我不知道中间件这么容易实现。当我在asp.net内核中搜索处理错误时,似乎有一些非常复杂的方法来处理。这太棒了。直接且易于吞咽。