WCF;keepAliveEnabled-同时有两个以上的套接字

本文关键字:两个 套接字 keepAliveEnabled- WCF | 更新日期: 2023-09-27 18:21:36

我尝试制作一个多线程请求程序,以测试服务器的应答时间。

我的服务器是一个WCF Web服务,我的客户端有一个对该Web服务的服务引用。

WCF尊重HTTP规范,我在许多网站上看到WCF默认启用了Keep Alive。只有来自同一客户端的两个连接同时被授权。

因此,当我尝试创建100个线程时,只有两个线程在同一时间进行处理。因此,在几个循环之后,许多线程都处于超时状态。

我试着遵循这篇文章:带有http keepalive的WCF wsHttpBinding,但它不起作用。

这是我的应用程序配置(由服务参考修改):

<?xml version="1.0"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_ISabIn" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://xxx.xxx.xxx.xxx:xxx/SabIn.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_ISabIn" contract="TestWs.ISabIn"
                name="BasicHttpBinding_ISabIn" />
        </client>
    </system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

我尝试在appCode中使用customBinding,就像这篇文章:HTTP保持活动和ServiceHost/C#?但是,当我执行软件时,会出现一个关于"application/xml"的错误。如果我试着用英语翻译,那会有点像"你的客户不管理application/xml消息"。

我需要做实时事务,如果WCF同时只管理两个套接字,我就做不到。。。

你能帮我吗?

附言:我可以发布我客户的代码,但我不确定是否有用,因为我知道问题是套接字限制。

解决方案(thnaks to Spender):在代码开始时,更改System.Net.ServicePointManager.DefaultConnectionLimit 中的默认值(为2)

WCF;keepAliveEnabled-同时有两个以上的套接字

这不是由默认.net对单个主机的HTTP请求限制引起的吗?这是因为ServicePointManager.DefaultConnectionLimit默认为2。

当您在内部发出HTTP请求时,会创建一个ServicePoint实例来管理与特定主机的连接。向同一主机发出新请求,它将使用同一ServicePoint实例进行连接管理。

您可以使用以下代码操作单个主机的限制:

var serviceUri = new Uri("http://xxx.xxx.xxx.xxx:xxx/SabIn.svc");
var servicePoint = System.Net.ServicePointManager.FindServicePoint(serviceUri);
servicePoint.ConnectionLimit = int.MaxValue;

我相信您也可以在web.config/app.config中处理此问题,但我不确定您是否可以调整与单个ServicePoint相关的限制。