C# ASP.NET Core-使用UseDeveloperExceptionPage()和自定义日志记录

C# ASP.NET Core-使用UseDeveloperExceptionPage()和自定义日志记录,c#,asp.net-core,error-handling,.net-core,C#,Asp.net Core,Error Handling,.net Core,我的ASP.NET核心应用程序中有以下代码来处理错误: if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler(builder => { builder.Run(async con

我的ASP.NET核心应用程序中有以下代码来处理错误:

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler(builder =>
            {
                builder.Run(async context =>
                {
                    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                    var loggingService = context.RequestServices.GetService<ILoggingService>();
                    var exceptionFeature = context.Features.Get<IExceptionHandlerFeature>();
                    if (exceptionFeature != null)
                    {
                        Exception ex = exceptionFeature.Error;
                        Console.Error.WriteLine(ex.Message + "   " + ex.StackTrace);
                        loggingService.Error(ex);
                    }
                });
        }
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseExceptionHandler(生成器=>
{
运行(异步上下文=>
{
context.Response.StatusCode=(int)HttpStatusCode.InternalServerError;
var loggingService=context.RequestServices.GetService();
var exceptionFeature=context.Features.Get();
if(exceptionFeature!=null)
{
Exception ex=exceptionFeature.Error;
Console.Error.WriteLine(例如Message+“”+ex.StackTrace);
loggingService.错误(ex);
}
});
}
但是,在
开发环境中时,我想同时使用
UsedeveloperCeptionPage()
和数据库日志的自定义错误处理。但这似乎不起作用(
UseExceptionHandler()
禁用
UsedeveloperCeptionPage()
的功能)


是否有任何方法可以实现这一点,而无需编写
usedeveloperceptionpage()
代码表单草稿?

对于内置的
usedeveloperceptionpage
,它没有公开任何扩展方法来定制错误过程,您可以尝试实现自己的中间件来记录错误,如

if (env.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
};
app.Use(async (context, next) =>
{
    try
    {
        await next.Invoke();
    }
    catch (Exception ex)
    {
        //var loggingService = context.RequestServices.GetService<ILoggingService>();
        //loggingService.Error(ex);
        Console.Error.WriteLine(ex.Message + " My " + ex.StackTrace);
        throw;
    }

});
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
};
应用程序使用(异步(上下文,下一步)=>
{
尝试
{
等待next.Invoke();
}
捕获(例外情况除外)
{
//var loggingService=context.RequestServices.GetService();
//loggingService.错误(ex);
Console.Error.WriteLine(例如Message+My+ex.StackTrace);
投掷;
}
});

我一直在努力解决这个问题,找不到关于这个主题的任何文档,但是通过查看源代码,我发现有一种方法可以将一些日志添加到开发者例外页面。源代码在这里,我将对其中的一些部分进行参考:

我们关心的是:

    _exceptionHandler = DisplayException;

    foreach (var filter in filters.Reverse())
    {
        var nextFilter = _exceptionHandler;
        _exceptionHandler = errorContext => filter.HandleExceptionAsync(errorContext, nextFilter);
    }
从本质上讲,在运行默认的DisplayExecution之前,它需要一组过滤器并将它们放入管道中

DI将过滤器作为
IEnumerable
传入,这意味着我们需要做的就是添加实现
IDeveloperPageExceptionFilter
的自己的类,然后它将被执行。下面是我测试的示例过滤器:

public class LoggingDeveloperPageExceptionFilter : IDeveloperPageExceptionFilter
{
    private readonly ILogService _logService;
    public LoggingDeveloperPageExceptionFilter(ILogService logService)
    {
        _logService = logService;
    }
    public Task HandleExceptionAsync(ErrorContext errorContext, Func<ErrorContext, Task> next)
    {
        _logService.Error(errorContext.Exception);
        return next(errorContext);
    }
}
公共类日志developerPageExceptionFilter:IDEDeveloperPageExceptionFilter
{
专用只读ILogService(日志服务);;
公共日志developerPageExceptionFilter(ILogService日志服务)
{
_logService=logService;
}
公共任务HandleExceptionAsync(ErrorContext ErrorContext,Func next)
{
_logService.Error(errorContext.Exception);
返回next(errorContext);
}
}
这在my startup.cs中注册为:

services.AddSingleton<IDeveloperPageExceptionFilter, LoggingDeveloperPageExceptionFilter>();
services.AddSingleton();

因此,在本例中,它将调用我的错误登录日志服务,将异常传递进来,然后调用处理链中的下一项。由于我只有一个
next
,因此我将使用原始的
DisplayException
,它将执行所有漂亮的错误输出。

如果您感兴趣,现在可以添加一些选项自定义处理到内置的UseDeveloperception页面中。有关详细信息,请参阅我的答案。