0

我在 Windows 服务中托管了一个简单的 WCF 服务。服务本身只模拟一个需要 10 秒才能完成的长事务。我在服务中还有代码可以将条目记录到我的数据库中,所以我知道它正在被调用,操作已完成,等等。以下是服务配置的摘要:

  1. 绑定:NetTcpBinding
  2. SessionMode:允许(没关系)
  3. IsOneWay:真
  4. InstanceContextMode:单
  5. 并发模式:单

然后我让我的测试客户端连续调用服务方法 4 次。我希望在日志中看到的是,所有内容都是按顺序执行的,当服务完成前一个调用时,多个调用排队并提供服务。

但是,我只能看到第一个呼叫被记录,其余呼叫被丢弃。如果我在每次通话之间留出 15 秒的间隔,那么每个通话都会被服务并记录下来。我搞砸了各种设置(inactivityTimeout、listenBackLog 等),但没有任何帮助。

我在这里想念什么?

4

1 回答 1

0
  • InstanceContextMode: single创建一个单例 - 只有一个服务类实例能够为请求提供服务。

  • ConcurrencyMode: single意思是:单例服务类一次只能处理一个请求,例如它将顺序处理传入的请求

通过使用这两个设置,您已经为自己创造了一个很好的瓶颈......是的,请求将一个一个地按顺序提供。所以很明显,在某些时候,第二个和后续请求必须遇到诸如超时之类的事情并被丢弃。这些超时通常设置为 1 分钟,因此 10 秒的事务不应该真正引起任何悲伤......

这实际上取决于您如何进行这些调用,并且由于您根本没有提供任何代码,我只能猜测。您是否使用单个 WCF 客户端代理?或者你真的有四个独立的应用程序实例,每个都发送一个请求?

您在发送请求的客户端是否收到任何错误或故障?如果是这样:什么样的错误?您的客户端代码是否会导致会话开始?

只是出于好奇:这只是一个思想实验,还是有什么具体原因要在系统中任意创建这样的瓶颈?推荐的最佳实践是 InstanceContextMode=PerCall,这将解决所有这些问题,我很确定:所有四个请求都将获得自己的服务类副本,并且它们应该同时处理,很好。

于 2011-02-03T21:38:42.480 回答