【问题标题】:Does WCF NetTcpBinding provide a persistent connection?WCF NetTcpBinding 是否提供持久连接?
【发布时间】:2012-10-24 02:57:07
【问题描述】:

使用 WCF 制作客户端/服务器样式的应用程序,但我找不到任何说明 NetTcpBinding 是否提供持久连接的文档?

我希望我的客户端一次连接并保持连接到服务器数周。 (是的,我知道我需要处理断开连接等。)

NetTcpBinding 是否允许像这样的长连接?如果是这样,我需要指定什么或者这是默认行为吗?

【问题讨论】:

  • 这可能取决于几件事,其中包括您如何托管服务和管理客户端代理的生命周期。即使这样,我也不确定 WCF 是否会保持客户端和服务器连接持续打开,但是您为什么要关心为什么您希望 WCF 将底层连接保持打开数周?你确定你不是asking about Y
  • 服务器需要保持每个客户端的连接,因为速度是我正在构建的系统的关键要求。当从服务器发送消息时,它需要尽快到达每个客户端。建立连接所花费的时间会导致无法接受的延迟。
  • @Kelly 从客户端频繁 ping WCF 服务怎么样?通过这种方式,您可以与服务stackoverflow.com/questions/1085220/pinging-wcf-services 保持长时间的连接。据我所知,由于通道工厂的创建,只有第一次调用需要更多时间,并且可能是其他组件,但后续调用(通道工厂将被缓存)通常会更快,并且您正在使用 net.tcp,这当然会更快.你真的做过测量吗?
  • @Kelly 你能解释一下你的服务吗?
  • 对服务的最佳描述是 pub/sub 样式模型。程序发布到服务,连接到它的客户端可以订阅以获取信息。它比这个做得更多,但这是它的核心。因此,我不希望订阅者仅因为他们正在收听非流动性主题而断开连接。目前使用 RabbitMQ 发布/订阅,但计划放弃它,并且想要一个自定义解决方案,因为它目前太慢了。 (是的,我知道 ZeroMQ 更快,但仍需要自定义,以便更好地控制它。)

标签: c# wcf


【解决方案1】:

只要您保持服务主机和客户端代理处于活动状态并处于打开状态,WCF 中的底层连接也应该保持打开状态。即使低于此值,绑定似乎也使用来自 TCP 连接池的连接,如 NetTcpBinding MSDN page 上所示:

NetTcpBinding 使用基于服务的主机 DNS 名称和服务正在侦听的端口号的 TCP 连接池。

我不是 TCP 连接池如何工作的专家,您可能想尝试一个姊妹站点,例如 ServerFault 以了解更多详细信息。

如果你想控制这一切,那么我能看到的唯一可以为开箱即用的 NetTcpBinding 调整的属性是MaxConnections。但是,如果您真的愿意深入研究,您还可以使用 TcpTransportBindingElement 构建自己的自定义绑定,这样您就可以更精细地控制 TcpConnectionPoolSettings

无论如何,如果我冒昧地猜测一下,我认为构建服务主机和客户端代理将比从池中获取连接所花费的时间(相对)多得多,因此保持这两个打开可能足以满足您的要求。

我在评论中问为什么您希望连接保持打开的原因是因为这本身几乎不是一个要求。不过,速度和响应时间真正的要求,因此最好的建议可能是明确这些要求(量化/限定您对速度的需求)并运行一些测试以确定最适合您的情况/需要什么.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2010-10-03
    • 2011-09-14
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多