You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 6中如何实现API进入与退出时的日志记录?

.NET Core 6 中实现 DelegatingHandler 记录 API 进出日志

步骤1:修正并完善日志处理器类

你的代码存在类名与构造函数名不一致的问题,同时.NET Core更推荐用依赖注入管理实例而非直接在构造函数中初始化。调整后的处理器类如下:

public class LoggingHandler : DelegatingHandler
{
    private readonly ApiLog _logIn;
    private readonly ApiLog _logOut;

    // 通过构造函数注入依赖,符合.NET Core依赖注入规范
    public LoggingHandler(ApiLog logIn, ApiLog logOut)
    {
        _logIn = logIn;
        _logOut = logOut;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // 记录进入API的请求日志
        _logIn.AddIncomingLog(request);
        
        // 调用后续处理器或控制器逻辑
        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
        
        // 记录API返回的响应日志
        if (response.Content != null)
        {
            _logOut.AddOutgoingLog(response);
        }

        return response;
    }
}

如果ApiLog需要连接字符串和日志类型参数,应在DI容器注册时传入,而非在处理器中硬编码实例化:

// 在Program.cs中注册ApiLog
builder.Services.AddScoped<ApiLog>(sp => 
    new ApiLog(
        builder.Configuration.GetConnectionString("YourDbConn"), 
        "ApiRequestResponse"
    )
);

步骤2:将处理器注册到管道

根据你的使用场景,分两种情况注册:

场景1:拦截当前Web API的请求/响应

将处理器注册为服务并添加到控制器过滤器管道:

// 注册LoggingHandler为瞬时服务
builder.Services.AddTransient<LoggingHandler>();

// 配置控制器,添加自定义处理器
builder.Services.AddControllers(options =>
{
    options.Filters.Add<LoggingHandler>();
});

场景2:用于调用外部API的HttpClient

将处理器添加到HttpClient的消息处理管道:

builder.Services.AddHttpClient("ExternalApiClient")
    .AddHttpMessageHandler<LoggingHandler>();

注意事项

  • 如果AddIncomingLog和AddOutgoingLog是同步方法,建议改为异步实现,避免阻塞请求线程
  • 日志中要过滤敏感信息(如令牌、密码),防止数据泄露
  • 依赖注入方式更便于后续的单元测试和配置修改

内容的提问来源于stack exchange,提问作者Newbie_thefirst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:05:02