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

如何为TestServer返回的HttpClient添加自定义HttpMessageHandler?

为TestServer的HttpClient添加自定义DelegatingHandler的方案

TestServer.CreateClient()没有直接传入自定义Handler的重载,但可以通过以下两种方式实现需求:

方案一:手动构建HttpClient并链入自定义Handler

直接将自定义Handler的InnerHandler指向TestServer的底层Handler,组合后创建HttpClient。

无依赖注入的Handler场景

如果你的HttpAuthenticationHandler不需要依赖其他服务,直接实例化配置即可:

[SetUp]
public void Setup()
{
    _server = new TestServer(new WebHostBuilder()
                             .ConfigureServices((builder, services) =>
                             {
                                 services.AddRouting();
                             })
                             .Configure(app =>
                             {
                                 app.UseRouting();
                                 app.UseEndpoints(endpoints =>
                                 {
                                     endpoints.MapGet("/api/helloworld", async context =>
                                     {
                                         await context.Response.WriteAsync("Hello World");
                                     });
                                 });
                             }));
    
    // 实例化自定义Handler,关联TestServer的底层Handler
    var authHandler = new HttpAuthenticationHandler();
    authHandler.InnerHandler = _server.CreateHandler();
    
    // 用组合后的Handler创建HttpClient
    _client = new System.Net.Http.HttpClient(authHandler);
}

需要依赖注入的Handler场景

如果Handler需要构造函数注入服务,先在TestServer的服务容器注册Handler,再获取实例配置:

[SetUp]
public void Setup()
{
    _server = new TestServer(new WebHostBuilder()
                             .ConfigureServices((builder, services) =>
                             {
                                 services.AddRouting();
                                 // 注册自定义Handler到服务容器
                                 services.AddScoped<HttpAuthenticationHandler>();
                             })
                             .Configure(app =>
                             {
                                 app.UseRouting();
                                 app.UseEndpoints(endpoints =>
                                 {
                                     endpoints.MapGet("/api/helloworld", async context =>
                                     {
                                         await context.Response.WriteAsync("Hello World");
                                     });
                                 });
                             }));
    
    // 从服务容器获取Handler实例并关联TestServer底层Handler
    var authHandler = _server.Services.GetRequiredService<HttpAuthenticationHandler>();
    authHandler.InnerHandler = _server.CreateHandler();
    
    _client = new System.Net.Http.HttpClient(authHandler);
}

方案二:使用HttpClientFactory配置(和常规应用一致)

如果你想和业务代码中使用HttpClientFactory的方式保持一致,可以在TestServer的服务配置里注册带自定义Handler的HttpClient:

[SetUp]
public void Setup()
{
    _server = new TestServer(new WebHostBuilder()
                             .ConfigureServices((builder, services) =>
                             {
                                 services.AddRouting();
                                 services.AddScoped<HttpAuthenticationHandler>();
                                 
                                 // 注册带自定义Handler的HttpClient,指定底层用TestServer的Handler
                                 services.AddHttpClient("testClient")
                                         .AddHttpMessageHandler<HttpAuthenticationHandler>()
                                         .ConfigurePrimaryHttpMessageHandler(() => _server.CreateHandler());
                             })
                             .Configure(app =>
                             {
                                 app.UseRouting();
                                 app.UseEndpoints(endpoints =>
                                 {
                                     endpoints.MapGet("/api/helloworld", async context =>
                                     {
                                         await context.Response.WriteAsync("Hello World");
                                     });
                                 });
                             }));
    
    // 从HttpClientFactory获取配置好的客户端
    _client = _server.Services.GetRequiredService<IHttpClientFactory>().CreateClient("testClient");
}

内容的提问来源于stack exchange,提问作者Q-bertsuit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:46:31