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

.NET Core 1.1中如何为AutoRest生成的构造函数注入DelegatingHandler数组

解决AutoRest生成客户端的DelegatingHandler注入问题(.NET Core 1.1)

别担心,DelegatingHandler其实就是用来给HTTP请求/响应加自定义逻辑的"中间件",比如日志、重试、统一加请求头这些,在.NET Core 1.1的DI体系里注入它其实很简单,我给你一步步讲清楚:

1. 先搞懂DelegatingHandler的作用(可选)

简单来说,它能拦截你的客户端发出的每一个HTTP请求,在请求发送前或者响应返回后执行自定义代码——比如给所有请求自动加上Authorization头,或者记录每个请求的耗时,这在实际项目里特别实用。

2. 注册自定义DelegatingHandler(如果需要的话)

如果你有自定义的handler(比如日志handler),先实现它:

public class LoggingDelegatingHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // 请求发送前的逻辑:记录请求地址
        Console.WriteLine($"请求地址:{request.RequestUri}");
        
        // 继续执行后续handler或发送请求
        var response = await base.SendAsync(request, cancellationToken);
        
        // 响应返回后的逻辑:记录状态码
        Console.WriteLine($"响应状态码:{response.StatusCode}");
        
        return response;
    }
}

然后在Startup.cs的ConfigureServices里注册这个handler:

services.AddTransient<LoggingDelegatingHandler>();
// 如果有多个自定义handler,逐个注册就行

3. 注入DelegatingHandler数组到AutoRest客户端

AutoRest生成的客户端构造函数接受params DelegatingHandler[] handlers,我们可以利用DI容器获取所有注册的handler,然后传给客户端:

public void ConfigureServices(IServiceCollection services)
{
    // 先注册自定义handler(如果有)
    services.AddTransient<LoggingDelegatingHandler>();
    
    // 注册AutoRest生成的客户端
    services.AddScoped<YourAutoRestClientName>(sp =>
    {
        // 从DI容器中获取所有注册的DelegatingHandler实例,转成数组
        var handlers = sp.GetServices<DelegatingHandler>().ToArray();
        
        // 实例化客户端,传入handlers(如果有base地址等其他参数也要加上)
        return new YourAutoRestClientName(new Uri("https://your-api-base-url.com"), handlers);
        // 如果客户端构造函数不需要base地址,直接传handlers就行:
        // return new YourAutoRestClientName(handlers);
    });
    
    // 其他服务注册...
}

4. 只注入特定的Handler(可选)

如果你不想注入所有注册的handler,只想传某几个特定的,也可以手动获取:

services.AddScoped<YourAutoRestClientName>(sp =>
{
    var loggingHandler = sp.GetRequiredService<LoggingDelegatingHandler>();
    // 比如还有一个重试handler
    var retryHandler = sp.GetRequiredService<RetryDelegatingHandler>();
    
    // 直接把需要的handler传给构造函数
    return new YourAutoRestClientName(loggingHandler, retryHandler);
});

注意事项

  • 在.NET Core 1.1里,GetServices<T>方法属于Microsoft.Extensions.DependencyInjection命名空间,确保你的项目引用了对应的NuGet包(一般默认已经包含)。
  • 如果不需要任何自定义handler,直接传空数组或者调用不带handlers参数的构造函数就行——params参数允许传0个元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:58:46