我在Windows服务中托管了一个简单的WCF服务。服务本身除了模拟需要10秒才能完成的长事务之外什么都不做。我还在服务中有代码将条目记录到我的数据库,所以我知道它正在被调用,操作完成,等等。以下是服务配置的摘要:
然后我让我的测试客户端连续4次调用服务方法。我希望在日志中看到的是,所有内容都按顺序执行,多个呼叫排队等候,并在服务完成之前的呼叫时提供服务。
但是,我只能看到记录的第一个呼叫,其余的被删除。如果我在每个呼叫之间留出15秒的间隙,那么每个呼叫都将被提供并记录。我搞乱了所有类型的设置(inactivityTimeout,listenBackLog,等等),但没有任何帮助。
我在这里缺少什么?
答案 0 :(得分:0)
InstanceContextMode: single
创建一个单例 - 只有一个服务类的实例才能为请求提供服务。
ConcurrencyMode: single
表示:该单件服务类一次只能处理一个请求,例如它将按顺序处理传入的请求
通过使用这两个设置,您已经创建了一个很好的瓶颈......是的,请求将按顺序逐个提供。很明显,在某些时候,第二个和后续的请求必须遇到类似超时或类似的东西而被丢弃。这些超时通常设置为1分钟,因此10秒的交易不应该造成任何悲伤......
这实际上取决于你如何进行这些调用,而且由于你根本没有提供任何代码,我只能猜测。您使用的是单个WCF客户端代理吗?或者你真的有四个独立的应用程序实例,每个实例发送一个请求?
您是否在发送请求的客户端出现任何错误或错误?如果是这样:出现什么样的错误?您的客户端代码是否会导致会话启动?
出于好奇:这只是一个思想实验,还是有任何特定的原因,你为什么要在你的系统中任意创造这样一个瓶颈?建议的最佳实践是使用InstanceContextMode = PerCall,这将解决所有这些问题,我很确定:所有四个请求都将获得自己的服务类副本,并且它们应该同时处理,就好了。