首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证是否已将我的DelegatingHandler添加到IHttpClientBuilder

验证是否已将我的DelegatingHandler添加到IHttpClientBuilder
EN

Stack Overflow用户
提问于 2020-09-01 06:08:47
回答 1查看 108关注 0票数 3

我的代码将命名HttpClient添加到ServiceCollection,并将DelegatingHandler添加到客户端。示例代码:

代码语言:javascript
复制
public class MyDelegatingHandler : DelegatingHandler
{
    // ...
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureServices((hostContext, services) =>
        {
            services.AddHttpClient("MyClient")
                .AddHttpMessageHandler(provider => new MyDelegatingHandler());
        });

在编写单元测试时,如何验证添加的DelegatingHandler实现是否为MyDelegatingHanlder

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-01 08:00:13

该信息存储在HttpClient的私有字段中。你可以做到这一点,但这有点不合常理。所以,你可能感兴趣,也可能不感兴趣,但如果你感兴趣,我就把这个放在这里:

代码语言:javascript
复制
public static class HttpClientExtensions
{
    public static bool ContainsDelegatingHandler<TDelegatingHandler>(
        this HttpClient httpClient) where TDelegatingHandler: DelegatingHandler
    {
        if(httpClient == null)
        {
            throw new ArgumentNullException(nameof(httpClient));
        }

        var internalHandlerField = typeof(HttpMessageInvoker).GetField(
            "_handler", BindingFlags.NonPublic | BindingFlags.Instance);
        if(internalHandlerField == null)
        {
            throw new InvalidOperationException(
                "_handler no longer exists as a private instance field of HttpClient");
        }

        // run down the chain of delegating handlers until there are no more
        var delegatingHandler = internalHandlerField.GetValue(httpClient) as DelegatingHandler;
        while (delegatingHandler != null)
        {
            if(delegatingHandler.GetType() == typeof(TDelegatingHandler))
            {
                return true;
            }
            delegatingHandler = delegatingHandler.InnerHandler as DelegatingHandler;
        }

        return false;
    }
}

要进行测试,首先必须使用工厂创建一个HttpClient

代码语言:javascript
复制
var httpClient = httpClientFactory.CreateClient("MyClient");

然后通过扩展运行它:

代码语言:javascript
复制
if(!httpClient.ContainsDelegatingHandler<MyDelegatingHandler>())
{
    throw new Exception(
        "HttpClient with name 'MyClient' does not contain " +
        $"{nameof(MyDelegatingHandler)} delegating handler.");
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63678810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档