我的代码将命名HttpClient添加到ServiceCollection,并将DelegatingHandler添加到客户端。示例代码:
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
发布于 2020-09-01 08:00:13
该信息存储在HttpClient的私有字段中。你可以做到这一点,但这有点不合常理。所以,你可能感兴趣,也可能不感兴趣,但如果你感兴趣,我就把这个放在这里:
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:
var httpClient = httpClientFactory.CreateClient("MyClient");然后通过扩展运行它:
if(!httpClient.ContainsDelegatingHandler<MyDelegatingHandler>())
{
throw new Exception(
"HttpClient with name 'MyClient' does not contain " +
$"{nameof(MyDelegatingHandler)} delegating handler.");
}https://stackoverflow.com/questions/63678810
复制相似问题