0

我正在查看 Microsoft 的双工 WCF 示例:

它从这里开始,但有趣的一点是客户端的最后。

  // Wait for callback messages to complete before
  // closing.
  System.Threading.Thread.Sleep(5000);

  // Close the WCF client.
  wcfClient.Close();
  Console.WriteLine("Done!");

如果你取出睡眠,你会得到一个例外

会话在消息传输完成之前关闭。

很明显,客户知道空气中有东西,有没有办法询问它的当前状态?有一个状态,但它只是定义它是打开还是关闭(即连接未激活)。

4

1 回答 1

1

这并不完全正确。您的方法是单向方法调用。因此,当您从客户端调用服务时,该调用(或一组调用)就完成了。换句话说,“消息”已传递给服务,并且由于它是单向的,因此不期望响应。它可能会在回调合约上回调......它可能不会。

当您设置双工通道时,您将建立一个端点以供服务回调(客户端本质上成为服务)。如果您关闭客户端,那么如果/当服务决定回调时,将发生通信异常。这就是这种消息交换模式的工作方式。

你真的有点回答了你自己的问题。也就是说,当您检查状态时,它是打开、关闭(或故障)。当您使用双工通道时,在这种情况下打开意味着通道上可能存在“活动”。这就是睡眠存在的原因 - 让服务有时间回拨。如果您查看 SDK 示例(http://msdn.microsoft.com/en-us/library/vstudio/ms752216(v=vs.110).aspx),它基本上在做同样的事情,只是它坐在那里等待您在关闭客户端应用程序之前按 ENTER。

因此,在一个真实的应用程序中(不是像这样的基于控制台的示例),要么保持客户端代理处于活动状态,要么将消息交换模式更改为请求/回复模式。

于 2013-08-17T05:33:08.957 回答