WCF NetTcpBinding +单实例+单一并发=阻止/删除呼叫?

时间:2011-02-03 20:21:20

标签: wcf concurrency nettcpbinding

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

  1. 绑定:NetTcpBinding
  2. SessionMode:允许(并不重要)
  3. IsOneWay:true
  4. InstanceContextMode:single
  5. ConcurrencyMode:single
  6. 然后我让我的测试客户端连续4次调用服务方法。我希望在日志中看到的是,所有内容都按顺序执行,多个呼叫排队等候,并在服务完成之前的呼叫时提供服务。

    但是,我只能看到记录的第一个呼叫,其余的被删除。如果我在每个呼叫之间留出15秒的间隙,那么每个呼叫都将被提供并记录。我搞乱了所有类型的设置(inactivityTimeout,listenBackLog,等等),但没有任何帮助。

    我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

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

  • ConcurrencyMode: single表示:该单件服务类一次只能处理一个请求,例如它将按顺序处理传入的请求

通过使用这两个设置,您已经创建了一个很好的瓶颈......是的,请求将按顺序逐个提供。很明显,在某些时候,第二个和后续的请求必须遇到类似超时或类似的东西而被丢弃。这些超时通常设置为1分钟,因此10秒的交易不应该造成任何悲伤......

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

您是否在发送请求的客户端出现任何错误或错误?如果是这样:出现什么样的错误?您的客户端代码是否会导致会话启动?

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