我对HttpClientFactory有一个问题,我试图将一个CancellationTokenSource从DI注入到配置为a的"SomeClient“中:
services.AddHttpClient<ISomeClient, SomeClient>(a =>
a.BaseAddress = new Uri(address))我在cancellationTokenSource ()中注入Startup.cs中的AddScoped<>。
如果我将CancellationTokenSource添加到SomeClient构造函数中,它会说
无法从根提供程序解析范围内的服务“System.Threading.CancellationTokenSource”。
但如果我创造出这样的东西:
services.AddScoped<ISomeClient, SomeClient>();并在构造函数中创建一个新的本地HttpClient,并注入CancellationTokenSource,一切都会好起来的。
那么,我的问题是如何将CancellationTokenSource与HttpClientFactory结合使用?
发布于 2018-12-06 07:02:55
对于AddHttpClient,它将SomeClient注册为Transient。但您将CancellationTokenSource注册为Scoped。这是根源造成的。
HttpClientFactoryServiceCollectionExtensions.cs
public static IHttpClientBuilder AddHttpClient<TClient>(this IServiceCollection services)
where TClient : class
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
}
AddHttpClient(services);
var name = TypeNameHelper.GetTypeDisplayName(typeof(TClient), fullName: false);
var builder = new DefaultHttpClientBuilder(services, name);
builder.AddTypedClient<TClient>();
return builder;
}HttpClientBuilderExtensions
public static IHttpClientBuilder AddTypedClient<TClient>(this IHttpClientBuilder builder)
where TClient : class
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
builder.Services.AddTransient<TClient>(s =>
{
var httpClientFactory = s.GetRequiredService<IHttpClientFactory>();
var httpClient = httpClientFactory.CreateClient(builder.Name);
var typedClientFactory = s.GetRequiredService<ITypedHttpClientFactory<TClient>>();
return typedClientFactory.CreateClient(httpClient);
});
return builder;
}因此,您可以尝试将CancellationTokenSource注册为Transient。
services.AddTransient<CancellationTokenSource>();https://stackoverflow.com/questions/53632991
复制相似问题