我目前正在开发一种安全的WCF服务,该服务将接收大量的呼叫,例如:超过3000.我最初的方法是使用' async'来调用web服务方法。但是很快我意识到我需要使用Task.WaitAll来确保在执行失败之前成功完成所有调用。
然而,通过利用WaitAll我现在重载服务,70%的呼叫返回了' CommunicationException'和' ServerTooBusyException'输入消息。我已经查看了WCF限制选项,但仍然发现它们似乎没有任何直接影响,即(注意:在本地IIS上本地运行web服务)
<serviceThrottling
maxConcurrentCalls="4096"
maxConcurrentSessions="65536"
maxConcurrentInstances="2147483647"/>
同步运行webservice调用工作正常,但运行速度太慢,我对等待来自Web服务的任何回调并不感到非常麻烦 - 我只是需要解雇并忘记&#39;这些调用服务。
这是我在客户端做的一个粗略的例子...
var numberOfIterations = 3000;
var allCalls = new List<Task>();
using (var service = new WebserviceServiceClient())
{
for (var n = 0; n < numberOfIterations; n++)
{
var someObject = new SomeObject(DateTime.UtcNow);
allCalls.Add(service.WebserviceMethodAsynch(SomeObject));
}
}
Task.WaitAll(allCalls.ToArray());
任何人都可以建议一种优雅的方法来从客户端轰炸WCF Web服务而不会出现大量失败的呼叫吗?
注意:一种方法是利用队列(在本例中为Azure队列),具有讽刺意味的是,被调用的服务在将对象添加到队列之前执行一些次要的预处理,以便由单独的,更密集的进程获取。
提前致谢
答案 0 :(得分:0)
您的客户端和您的网络服务不在同一台机器上,对吧?无论如何,我相信你最好使用负载测试来达到你想要的结果:
http://www.sandeepsnotes.com/2013/05/load-and-performance-testing-of-wcf.html