如何管理最大连接数、HttpClient、C#?
How to manage max connection, HttpClient, C#?
我正在开发一项 windows 服务。 windows服务的代码很简单,但是方式很奇怪!
在 windows 服务中,我应该每 20 秒调用一次 WebApi 并将结果保存在 SQL 数据库中
我正在使用 autofac
在 Program.cs
处创建 HttpClient
的实例
// HttpClient
builder.Register(ctx =>
{
var httpClient = new HttpClient
{
BaseAddress = new Uri(StaticAssets.WebApiBaseAddress)
};
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
return httpClient;
});
我从不手动处理 httpClient
实例。
在 运行 windows 服务大约 8 小时后,IIS 无法工作,我们无法再远程连接到服务器,我们测试了 Windows 远程桌面连接,VNC(我们在服务器上有 VNC).. .
我们可以使用 KVM 远程连接到服务器并停止 windows 服务,一切都会恢复。
我可以从 here 中找到问题是因为连接数!我还不确定?
我还发现了以下内容:
<system.web>
<processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>
<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"/>
</system.web>
<system.net>
<connectionManagement>
<add address="[ProvideIPHere]" maxconnection="96"/>
</connectionManagement>
</system.net>
在 HttpClient
.Net windows 服务和 IIS 中管理最大连接数的最佳做法是什么?
基于谷歌搜索的解决方案:
1.定义HttpClient
为SingleTone,不要手动配置
在 AutoFac
中使用如下内容:
builder.Register(ctx =>
{
var httpClient = new HttpClient
{
BaseAddress = new Uri('https://www.sample.com/')
};
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
return httpClient;
}).SingleInstance();
在 .Net Core
中使用以下内容:
services.AddSingleton(provider =>
{
var httpClient = new HttpClient
{
BaseAddress = new Uri('https://www.sample.com/')
};
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
return httpClient;
});
2。在您的 config
文件中添加以下内容
<configuration>
....
<system.web>
<processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>
<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"/>
</system.web>
<system.net>
<connectionManagement>
<add address="[ProvideIPHere]" maxconnection="96"/>
</connectionManagement>
</system.net>
</configuration>
我正在开发一项 windows 服务。 windows服务的代码很简单,但是方式很奇怪!
在 windows 服务中,我应该每 20 秒调用一次 WebApi 并将结果保存在 SQL 数据库中
我正在使用 autofac
在 Program.cs
HttpClient
的实例
// HttpClient
builder.Register(ctx =>
{
var httpClient = new HttpClient
{
BaseAddress = new Uri(StaticAssets.WebApiBaseAddress)
};
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
return httpClient;
});
我从不手动处理 httpClient
实例。
在 运行 windows 服务大约 8 小时后,IIS 无法工作,我们无法再远程连接到服务器,我们测试了 Windows 远程桌面连接,VNC(我们在服务器上有 VNC).. .
我们可以使用 KVM 远程连接到服务器并停止 windows 服务,一切都会恢复。
我可以从 here 中找到问题是因为连接数!我还不确定?
我还发现了以下内容:
<system.web>
<processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>
<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"/>
</system.web>
<system.net>
<connectionManagement>
<add address="[ProvideIPHere]" maxconnection="96"/>
</connectionManagement>
</system.net>
在 HttpClient
.Net windows 服务和 IIS 中管理最大连接数的最佳做法是什么?
基于谷歌搜索的解决方案:
1.定义HttpClient
为SingleTone,不要手动配置
在 AutoFac
中使用如下内容:
builder.Register(ctx =>
{
var httpClient = new HttpClient
{
BaseAddress = new Uri('https://www.sample.com/')
};
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
return httpClient;
}).SingleInstance();
在 .Net Core
中使用以下内容:
services.AddSingleton(provider =>
{
var httpClient = new HttpClient
{
BaseAddress = new Uri('https://www.sample.com/')
};
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
return httpClient;
});
2。在您的 config
文件中添加以下内容
<configuration>
....
<system.web>
<processModel maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50"/>
<httpRuntime minFreeThreads="704" minLocalRequestFreeThreads="608"/>
</system.web>
<system.net>
<connectionManagement>
<add address="[ProvideIPHere]" maxconnection="96"/>
</connectionManagement>
</system.net>
</configuration>