我可以使用异步WCF服务来避免网络超时问题吗?

时间:2014-08-14 10:34:03

标签: wcf asynchronous

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

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

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

问题是:它是否会阻止代理人对他们认为花费太长时间的请求进行超时?

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

3 个答案:

答案 0 :(得分:2)

There are no callbacks at the network level.异步IO就是不会阻塞单台机器上的线程。两个通信方都可以独立决定使用同步或异步IO。任何一方都无法检测对方选择的内容。

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

Async IO无法解决您的超时问题。这些超时是由网络上的某些东西引起的(如你所说)。网络与服务的实现方式无关。它甚至无法找到并回应它。

答案 1 :(得分:1)

超时事件在http堆栈中,与编程中的异步事物无关。 Google" windows http stack"你可能会发现原因。

"只是继续讨论异步编程如何帮助您构建响应式GUI和诸如此类的东西。"这有助于您不使用像http请求/响应这样的长时间运行来阻止UI线程。

默认情况下,WCF服务是多线程的 - 在一个请求时,会创建一个新线程。

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

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

答案 2 :(得分:1)

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

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