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)
这不是由默认.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相关的限制。