代码之家  ›  专栏  ›  技术社区  ›  Mohammad Dayyan

如何管理max connection、httpclient、c?

  •  2
  • Mohammad Dayyan  · 技术社区  · 7 年前

    我在做一个windows服务。windows服务的代码很简单,但方式很奇怪!
    在windows服务中,我应该每20秒调用一个webapi并将结果保存到sql数据库中
    我在用 autofac 创建的实例 HttpClient Program.cs

    // 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>
    

    https://support.microsoft.com/en-us/help/821268/contention-poor-performance-and-deadlocks-when-you-make-calls-to-web-s

    管理最大连接数的最佳实践是什么 httpclient公司 .NET Windows服务和IIS?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Mohammad Dayyan    6 年前

    基于google的解决方案:

    一。定义 HttpClient 作为单音,不要手动处理。
    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>