【问题标题】:wcf operation times out without errorwcf 操作超时且无错误
【发布时间】:2013-06-21 19:16:14
【问题描述】:

我有一个托管在 IIS 6.0 上的 .NET 3.5 BasicHttpBinding 无安全 WCF 服务。

我根据 MS 的建议提高了服务限制。

我的服务操作同时被调用数百次,并且在某些时候客户端收到超时异常(59:00,这是服务器和客户端超时设置的内容)。

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

似乎应用程序只是在某个地方“冻结”了,我们无法弄清楚这是怎么发生的。

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

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

谢谢

【问题讨论】:

  • WCF 中的超时可能表明服务中存在问题(通常是某种未处理的异常)。您提到这是托管在 IIS 中的-您知道客户端完成后是否正在关闭他们的频道吗?如果不是这样,这也可能是问题的根源,因为您可能会遇到资源限制,客户可能会“自然死亡”,可以这么说。
  • 您提到了数百个并发请求,但它适用于单个请求吗?另外请检查服务器上的事件日志,它可能有系统错误或什么的。
  • 您是否正确关闭了您的频道?我们遇到了类似的问题,发现客户端的一些操作没有关闭他们的IClientChannel,导致大量打开的通道,最终导致服务器无法接受新的连接。
  • 我们正在关闭我们的频道。我们正在为每个调用实例化一个新生成的代理,然后在其上调用 .Close() 。顺便说一句,即使 basicHttpBinding 也需要 .Close() 吗?

标签: performance wcf iis throttling


【解决方案1】:

我假设您的 WebService 没有使用新的 async/await,尤其是数据库调用。在这种情况下,这是因为您阻塞了有限的线程。

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

在某些时候,数据库调用返回、处理内容……将数据发送到客户端。另有 8 个请求出列...命中数据库...等...

但是,每组 8 个请求都需要有限的时间才能完成。由于前面有超过 900 个请求,最后 100 个左右的线程将至少需要 100 * 延迟 * 往返次数才能启动。如果您的延迟 * 往返次数很高...您的最后一个请求将需要很长时间才能出队,因此会超时。

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

See here for more information

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 2015-08-10
    • 2018-06-26
    • 2016-10-21
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 2015-06-02
    相关资源
    最近更新 更多