我在多线程环境中调用Web服务。很多我的调用由于操作超时或错误的请求而失败,但是如果我以线性方式执行调用则没有调用失败,这意味着调用具有多个线程的webservice存在问题。经过大量的分析,我发现并发连接的限制导致了这些异常,所以我通过添加下面的代码来修复它。
ServicePointManager.DefaultConnectionLimit = 2 * _ThreadCount;
我不知道增加此限制的可能缺点。默认情况下,连接限制为2.如果有人知道任何缺点,请告诉我。
答案 0 :(得分:2)
MSDN说:
更改现有的DefaultConnectionLimit属性无效 ServicePoint对象;它只影响ServicePoint对象 更改后初始化。如果此属性的值没有 直接或通过配置设置,值默认 到常量DefaultPersistentConnectionLimit。
和
注意强>
对DefaultConnectionLimit属性的任何更改都会影响HTTP 1.0和HTTP 1.1连接。无法单独更改HTTP 1.0和HTTP 1.1协议的连接限制。用于 服务器环境(ASP.NET)DefaultConnectionLimit默认为 更高的连接数,即10。
答案 1 :(得分:1)
不,除了您的AppDomain将消耗更多资源之外,不应存在任何其他缺点。但在你的情况下,它是微不足道的。
事实上,它实际上可以帮助您使用更少的资源(内存),因为挂起的请求在ServicePoint内部排队。请阅读此处以获取更多信息:Big size of ServicePoint object after several hours sending HTTP request in parallel
让我给你一张照片....我有大约46K的任务,这些任务是100批次运行的(每个任务都会调用webservice)所以我有100个线程同时调用webserivce。它仍然是微不足道的吗?或者它会对我的情况产生一些影响吗?
它当然会产生影响。但影响取决于许多因素。服务点是每个主机。
如果您的任务主要针对同一主机,请将DefaultConnectionLimit
增加到更大的值(当前执行批处理中的预期任务数)。
如果您主要针对不同的主机提出请求,则问题的限制可以正常工作。
关于资源的使用,只要您的服务器不是很忙于其他应用程序,它就可能很好。
答案 2 :(得分:0)
您还应该意识到,它可能在另一端伤害您。 如果您给要调用的Web服务增加了很大的负担,则可能会出现节流或黑名单的情况。例如,请参见此blog。