我正在使用NET Framework4.7.2与Autofac和Topshelf,并且我已经实现了一个HTTPClient,如下所示:
private static IContainer BuildContainer() {
NameValueCollection anexiaADSettings = (NameValueCollection)ConfigurationManager.GetSection("AnexiaADSettings");
var services = new ServiceCollection();
services.AddHttpClient("API", c => {
c.BaseAddress = new Uri(Settings["APIUrl"]);
c.DefaultRequestHeaders.Add("Authorization", "Token " + Settings["APIToken"]);
c.DefaultRequestHeaders.Accept.Clear();
c.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
});
var providerFactory = new AutofacServiceProviderFactory();
ContainerBuilder builder2 = providerFactory.CreateBuilder(services);
//Builder Settings
var container = builder2.Build();
return container;
}在我的Worker类中,我的构造函数看起来像:
private readonly ILogger _log;
private readonly IHttpClientFactory _clientFactory;
public LDAP(ILogger log, IHttpClientFactory clientFactory) {
this._log = log;
this._clientFactory = clientFactory;
}我在一个带有以下参数的多线程foreach循环中调用我的httpClient:
var httpClient = _clientFactory.CreateClient("API");
test= await httpClient.GetFromJsonAsync<Models.GSObject>(uri);问题是,foreach循环启动了多次,但显然只有一个活动的httpClient实例。如果我使用10个线程执行该方法,则GetFromJsonAsync将按顺序运行。如果第一个调用已经执行,它将转到下一个调用,依此类推。httpClient不应该获得与我触发foreach循环相同数量的实例吗?
编辑:这是当前执行的循环,最多有10个线程:
var taskThrottler = new SemaphoreSlim(initialCount: 10);
var compareTasks = new List<Task>();
foreach (var User in Users.data.data) {
await taskThrottler.WaitAsync();
compareTasks.Add(
Task.Run(async () => {
try {
await _helper.CompareUsersAsync(_settings, adUsers, gsUser.identifier);
}
finally {
taskThrottler.Release();
}
})
);
}CompareUsersAsync方法如下所示:
public async Task CompareUsersAsync(Settings settings, List<Models.ADUser> adUsers, string identifier) {
var httpClient = _clientFactory.CreateClient("API");
try {
string uri = "api/request.json/" + identifier;
Models.GSADUser gsUser = await httpClient.GetFromJsonAsync<Models.GSADUser>(uri);
//Removed the rest of the code.发布于 2021-03-02 01:32:34
我已经找到了解决方案。到同一服务器的连接的默认最大值设置为2。如果你想增加这个值,你必须定义一个ServicePointManager,如下所示:
ServicePointManager.DefaultConnectionLimit = 20;
var services = new ServiceCollection();
services.AddHttpClient("EngineAPI", c => {
c.BaseAddress = new Uri("URL");
c.DefaultRequestHeaders.Add("Authorization", "Token " + settings["APIToken"]);
c.DefaultRequestHeaders.Accept.Clear();
c.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
});在这种情况下,最多允许20个连接到同一个端点。
https://stackoverflow.com/questions/66388980
复制相似问题