我已经浏览了互联网和堆栈溢出来寻找答案,但我似乎无法得到我的问题的明确答案。
我有大约 50 个客户端分布在全国各地,它们每隔 10-20 分钟定期通过 Windows 服务自动向服务器打开 WCF WSHTTPBinding 调用。这很好用,因为我限制了可以通过服务器连接并执行长时间运行操作的客户端的数量,然后客户端知道它不能做任何事情并在下次重新签入时尝试。
直到昨天,在同一路由器后面有 7 个独立系统的一个客户端开始出现非常非常慢的互联网问题时,这一直运行良好。所以这 7 个系统每隔 10-20 分钟就会打开一个与服务器的连接,并执行它们的“签入”程序。调用需要一段时间,每个系统可能会使用多达 7 个与服务器的连接一次连接到服务。其他 43 个系统也需要每 10-20 分钟“签到”一次。但是由于具有 7 个系统的客户端的互联网速度很慢,因此对服务上长时间运行的进程的调用花费的时间比正常情况要长,并最终在客户端上超时(有时我什至会遇到过时的安全时间戳错误)。
我需要我的服务完全不受客户互联网问题的影响,并且该服务需要继续为继续“签到”的其他客户提供服务。
现在,我已经在服务端实现了服务节流行为:
Dim stb As New ServiceThrottlingBehavior
stb.MaxConcurrentSessions = 100
stb.MaxConcurrentCalls = 20
stb.MaxConcurrentInstances = 120
serviceHost.Description.Behaviors.Add(stb)
我在那里做了一些阅读并找到了这个设置,但到目前为止我的代码中没有这个:
System.Net.ServicePointManager.DefaultConnectionLimit
我试图理解但不完全理解。所以,现在有了我的解释,这是我的问题:
- 我是在服务端还是客户端设置 System.Net.ServicePointManager.DefaultConnectionLimit?
- 我会在哪里设置?在我打开 ServiceHost 之前?在我创建 ServiceHost 之前?
- 对于 WCF 的连接限制和并发调用,还有其他需要更改的地方吗?(从我的阅读看来可能有一些,具体取决于您使用的绑定)
注意:如果您发布答案,请使用代码,我不使用配置文件进行绑定,我以编程方式创建绑定。
谢谢你。