ASP.Net Core ILogger.BeginScope是否可以包装中间件管道

sea*_*ght 5 logging asp.net-core

我创建了一个自定义中间件来处理我的Api应用程序中的异常。

我想将请求ID与异常以及我在应用程序中执行的任何其他日志记录相关联。然后,我想处理所有异常,并使用requestId生成的I 响应客户端。

这样一来,他们可以通过与我联系requestId,我可以在日志中查询并查看他们收到错误时的情况。

这是Invoke我的中间件的和requestId响应中的发送。

public async Task Invoke(HttpContext context, ILoggerFactory loggerFactory)
{
    var requestId = Guid.NewGuid();
    var requestScopeLogger = loggerFactory.CreateLogger("AppRequest");

    using (requestScopeLogger.BeginScope("Request {requestId}", requestId))
    {
        try
        {
            await next(context);
        }
        catch (Exception ex)
        {
            await HandleExceptionAsync(context, ex, requestId);
        }
    }
}

private Task HandleExceptionAsync(HttpContext context, Exception exception, Guid requestId)
{
    ...
    var response = JsonConvert.SerializeObject(new { errorMessage = clientResult.message, requestId });

    context.Response.ContentType = "application/json";
    context.Response.StatusCode = (int)clientResult.code;

    return context.Response.WriteAsync(response);
}
Run Code Online (Sandbox Code Playgroud)

中间件先于我的其他组件(StaticFiles,Swagger,Mvc)注册 Startup.Configure

当我在Api业务逻辑或控制器中测试引发异常时,一切似乎都正常运行。

这是可接受的用法ILogger.BeginScope吗?是否可以通过这种方式包装中间件管道async