【问题标题】:Can I use async WCF services to avoid network timeout problems?我可以使用异步 WCF 服务来避免网络超时问题吗?
【发布时间】:2014-08-14 10:34:03
【问题描述】:

我有一个可能长时间运行的同步旧 WCF 服务。对于某些客户端,此操作似乎会导致网络超时 - 不是在客户端或服务端,而是在对我不透明的网络拓扑中的某个代理服务器的中间某处。

问题是:我可以通过在服务端使用基于事件的异步模式(使用IAsyncResult/BeginXXX()EndXXX())来解决这个问题吗?

我对异步服务的回调机制实际上是如何在网络级别工作感到困惑。客户端是否进行定期轮询,或某种长轮询,或完全不同的事情?除非我只是不擅长使用谷歌(我相信我不是),否则 MSDN 文档在这方面似乎完全缺乏。 In only 继续讨论异步编程如何帮助您构建响应式 GUI 等等。

问题是:它会阻止代理超时他们认为耗时过长的请求吗?

编辑:澄清一下:有问题的服务使用basicHttpBinding

【问题讨论】:

    标签: wcf asynchronous


    【解决方案1】:

    There are no callbacks at the network level. Async IO 就是不阻塞单台机器上的线程。通信双方可以根据需要独立决定使用同步或异步 IO。任何一方都无法检测对方选择了什么。

    您正在使用基于 SOAP 的basicHttpBinding。 SOAP 没有异步调用的概念。其他任何绑定也没有。

    异步 ​​IO 无法解决您的超时问题。这些超时是由网络上的某些东西引起的(如你所说)。网络与服务的实现方式无关。它甚至无法发现和响应。

    【讨论】:

    • 所以你是说在网络层面,同步和异步的web服务调用是一回事?
    • @chris 是的。您无法使用 WireShark 或 Fiddler 检测到差异。这与套接字相同。您会期望套接字也是如此,对吗?远程端不关心您是调用 Send 还是 BeginSend。发送的字节是一样的。
    • 嗯,这不是我希望的答案,但至少现在我已经确认我需要一个不同的解决方案......
    • @chris 我建议您提出一个新问题以找出可能导致这些超时的原因。也许一些代理会切断空闲的 TCP 连接?!因为正如我所说:在长时间运行的呼叫期间,连接是 100% 空闲的。
    • 是的,一些代理切断空闲连接正是我认为的罪魁祸首。不幸的是,我无法控制发生问题的网络拓扑,因此我可能不得不尝试重构服务以避免长时间运行的调用。
    【解决方案2】:

    超时的东西在http栈,和编程中的异步东西没有关系。谷歌“windows http stack”你可能会发现原因。

    “仅继续讨论异步编程如何帮助您构建响应式 GUI 之类的东西。”这可以帮助您避免使用诸如 http 请求/响应之类的长时间运行的操作来阻塞 UI 线程。

    默认情况下,WCF 服务是多线程的——根据一个请求,会创建一个新线程。

    在客户端,如果您使用的是 .NET 4.5,您可能会发现生成的客户端代理类支持异步操作,但这与 http 超时无关。这些函数使客户端的异步/并行编程更容易。

    简而言之,超时时间由服务器和客户端上的 http 堆栈决定。如果您对服务器和客户端都有控制权,则可以增加双方的超时值,作为快速而肮脏的解决方案。

    【讨论】:

    • 我知道这发生在 HTTP 堆栈上,就像我说的那样,它可能既不会发生在服务端,也不会发生在客户端,而是发生在中间的某个代理上。因此,增加服务器和/或客户端的超时将无济于事。我认为这个问题真的归结为回调机制在网络层面是如何工作的——它是否一直保持连接打开,是否进行某种轮询,...?
    • 好的,现在知道了。看来我误解了异步服务的用途。
    • 如果你在服务器端有一个长时间运行的操作,比如说持续超过 2 分钟甚至几个小时来生成结果,让客户端等待结果并保持是不切实际的一个连接。然后您可以在应用程序级别设计一个异步协议。例如,该服务会将长操作委托给另一个不受超时限制的服务,并将结果传递到一个虚拟邮箱,客户端可以定期向该邮箱查询。
    • 是的,我知道 - 我的误解是假设异步服务方法就是这样做的。
    【解决方案3】:

    我认为它不会阻止超时,因为异步开发是在客户端独立于协议和网络配置的。对于 HTTP,这可能是一个注册表设置。

    我的理解是 Windows I/O 本质上是异步的,所以我认为不会有任何轮询,而是一旦 IO 完成,就会发生某种操作系统级别的中断。您可能会发现 Stephen Cleary 的 this article 很有帮助。此外,Windows Internals 的书籍也可能是一个很好的参考。

    【讨论】:

      猜你喜欢
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      相关资源
      最近更新 更多