wcf - 何时使用双工服务?

标签 wcf tcp duplex

嗯,我知道在双工契约(Contract)中,服务可以向客户端发送消息,但我想知道什么时候真正有用。

我有一个常见的应用程序,它向服务发送请求以从数据库中获取数据、插入数据...等等。此外,我需要在数据库中存储大约 40MB 的文件,因此我需要良好的性能。为此,我想使用流式传输模式的 net.tcp 绑定(bind),但问题是 net.tcp 双工服务不能使用流式传输模式。

所以我想我有一些选择。

1.- 研究我是否真的需要这种应用程序的双工契约(Contract)。例如,也许在聊天应用程序中,双工契约(Contract)更有意义,因为服务器可能需要在联系人连接时通知客户端......等等。但在访问数据库的普通客户端中,是必要的双重契约(Contract)?什么样的操作需要双工契约(Contract)?

2.- 其他选项不是双工契约(Contract),而是在服务器中实现非双工契约(Contract),在客户端中实现其他单一契约(Contract),因此当客户端连接到服务时,服务会收到所需的信息连接到客户端的服务。但是,这是避免双重契约(Contract)的好方法吗?

3.- 对于我的应用程序,我真的需要 tcp 而不是允许流式传输模式的双工 HTTP 吗? tcp 在性能方面比 HTTP 有什么优势?

谢谢。

最佳答案

如果你想实现回调模式,你需要双工。回调意味着客户端不知道服务器何时发生某些事件。

如果您不知道事件何时发生,您有两种选择:

  1. 轮询 - 每 X 分钟发送一次请求以检查事件是否发生。服务器应该返回事件详细信息(如果它发生了)或返回表明您需要继续调用的标志。服务器还可以在高级场景中返回建议的超时。
  2. 回调 - 客户端发送某种形式的描述,如果事件发生,服务器应该做什么。这可能是指向 C 中的函数、.NET 中的委托(delegate)或 WCF 中的端点架构的指针。服务器会记住该信息,并在时间到了时从他们身边调用电话。

如您所见,双工/回调意味着服务器在某些时候充当客户端(发起通信),这是一个重大的游戏改变。

WCF 双工通信可能需要特殊的网络配置,因为在许多情况下网络允许您调用外部服务(您作为客户端)但禁止外部资源调用您(外部服务作为客户端)。这是出于安全目的而实现的。

回到你的问题:

  1. 如果您只需要下载大量数据,则不需要双工。如果您想捕获服务器中发生的更新并通知客户端,您可能需要它。 Duplex 应该适用于 Chat,因为在聊天中有很多场景需要通知客户端其他人引入的更改。
  2. 您描述的是双工 channel 的手工变体。如果您希望服务器调用您的方法,您应该使用 MS 提供的经过验证和测试的双工实现。否则,您的选择是轮询。
  3. 你是对的,你需要tcp + streamed传输模式来处理大数据量。 TCP 使用二进制序列化,它比文本序列化更紧凑 + 使用 TCP,您不需要发送任何 HTTP header 或 SOAP 信封。如果不需要,请禁用安全性。它对性能有很大的影响。

关于wcf - 何时使用双工服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11192723/

相关文章:

c# - 带有命名管道的 WCF 错误 "no endpoint listening"

wcf - 具有WCF消息安全性的soapUI

c# - 查找打印机的默认双面打印选项

c# - 如何在回调 channel 上抛出错误通知客户端?

silverlight - WCF:OneWay OperationContract 上的异常处理

数据协定、共享类和 DTO 的 WCF 最佳实践

c# - 使用 svcutil.exe 测试此服务

tcp - 二进制文件的快速传输

c++ - winsock 和 QTcpServer 之间的套接字交换

javascript - 尝试使用套接字通过 TCP 连接到远程计算机时出现“ECONNREFUSED”