2013-06-25 30 views
0

我有一个.NET 3.5 BasicHttpBinding在IIS 6.0上没有托管WCF服务。wcf操作超时而不出错

根据MS建议,我有服务节流问题。

我的服务操作被并发地调用了几百次,并且在某个时间点客户端得到一个超时异常(59:00,这就是服务器和客户端超时设置)。

如果我提高超时时间,它只是达到了新的限制。

看起来应用程序只是“冻结”在某个地方,我们一直无法弄清楚这是怎么发生的。

服务器端的WCF跟踪没有任何东西。

任何想法可能是什么问题?

感谢

+0

超时在WCF能够指示该服务的问题(某种通常未处理的异常)。你提到这是在IIS中托管的 - 你知道客户是否正在关闭他们的频道吗?如果他们不这样做,这也可能成为问题的根源,因为您可能会遇到资源限制,客户可能会“死于自然死亡”,可以这么说。 – Tim

+0

你提到了数百个并发请求,但它是否适用于单个请求?另外请检查服务器上的事件日志,它可能有系统错误或其他。 – Anu

+0

你正确关闭你的频道吗?我们遇到了类似的问题,并发现客户端的一些操作没有关闭它们的IClientChannel,导致了很多开放的通道,从而导致服务器无法接受新的连接。 – Jobo

回答

0

我假设你的WebService不使用新的异步/伺机尤其是写入数据库调用。在这种情况下,因为你阻止了你有限的线程。

更详细地说, IIS/ASP.net只创建有限数量的线程来处理请求。第一个...说8个请求启动线程并开始工作。在某些时候,他们会击中数据库(我假设一个传统的N层应用程序)。那些线程睡眠。接下来说... 992个请求命中IIS并保存在一个队列中。

在某些时候,数据库调用return,process stuff ...将数据发送到客户端。另外8个请求被出列...击中数据库...等等...

然而,每个8个请求集合都需要有限的时间才能完成。在超过900个请求之前,最后100个左右的线程在启动之前至少需要100倍的延迟*往返数。如果您的延迟*往返次数很高......您的最后一次请求将需要很长时间才会出现,因此超时。

存在两种补救措施。首先,创建更多的线程....将用尽所有的内存和你的IIS崩溃。第二个是使用.net 4.5和async/await。

See here for more information