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

use*_*353 5 c# error-handling .net-core asp.net-core

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

        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);
                    }
                });
        }
Run Code Online (Sandbox Code Playgroud)

但是,在Development环境中时,我想UseDeveloperExceptionPage()对数据库日志记录使用和自定义错误处理。但这似乎不起作用(UseExceptionHandler()禁用了 的功能UseDeveloperExceptionPage())。

有没有办法实现这一点,而无需编写UseDeveloperExceptionPage()代码表单?

Tao*_*hou 4

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

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;
    }

});
Run Code Online (Sandbox Code Playgroud)