1

我已经浏览了互联网和堆栈溢出来寻找答案,但我似乎无法得到我的问题的明确答案。

我有大约 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 的连接限制和并发调用,还有其他需要更改的地方吗?(从我的阅读看来可能有一些,具体取决于您使用的绑定)

注意:如果您发布答案,请使用代码,我不使用配置文件进行绑定,我以编程方式创建绑定。

谢谢你。

4

1 回答 1

0

我不明白你的服务在做什么,“网速慢”会影响它。您是否每次签到都来回发送大量数据?如果没有更多关于设计的细节,很难说到底发生了什么。

也就是说,我认为你应该再看看设计。如果服务器在响应客户端之前正在执行一个非常长时间运行的操作,那么客户端不应该只是闲逛并一次通过 HTTP 等待它 10 分钟。发送请求会更有意义,然后偶尔检查一下它是否完成(并且不需要保持连接)或使用 net.tcp 作为绑定并使用更适合保持如此长连接的东西( net.tcp 也可以使用回调在调用完成时通知客户端)。

于 2011-02-11T21:41:00.343 回答