【问题标题】:WCF Binding for non-WCF TCP Server非 WCF TCP 服务器的 WCF 绑定
【发布时间】:2018-09-08 05:01:41
【问题描述】:

我有一个旧的非 WCF Windows 服务,它创建一个 TCPClient 以连接到非 WCF TCP 服务器。我根本无法更改服务器应用程序。它尝试创建 2 个线程,一个用于从服务器读取和处理消息,一个用于从 MSMQ 队列中读取、处理,然后发送到 TCP 服务器。不幸的是,有问题,有时如果网络断开,我会得到两个读取或写入线程的实例。线程共享同一个 TCPClient 连接。

希望将我的服务切换到由 Windows 服务托管的 WCF。我知道我可以将 MSMQIntegration 绑定用于发送方法,但我不确定如何绑定到共享 TCP 连接。 netTCPBinding 似乎也仅限于 WCF 到 WCF 的连接。有人对如何进行有建议吗?

【问题讨论】:

    标签: c# vb.net wcf tcpclient


    【解决方案1】:

    这在理论上可以通过 WCF 的可扩展性实现,但您必须编写自定义端点、自定义消息格式化程序和其他 50 个类。我建议单独实现 TCP 服务。

    当您处理通过标准端点(传输)使用类似 XML 的消息的类 SOAP 服务时,最好考虑 WCF 可扩展性。当您“非常接近”时,通常可以修补差异。当您不使用这些时,WCF 会成为障碍,而不是节省时间。例如,如果出现以下情况,我会使用 WCF 可扩展性:

    • 我有一个 SOAP 服务需要通过 SMTP 或其他一些奇怪的传输(自定义端点)运行
    • 我有一个在标准端点 (I*MessageInspector) 上运行的自定义 xml 格式
    • 我有一个自定义格式,可以很容易地转换为运行在标准端点(自定义消息编码器)上的 XML

    我不会将 WCF 用于:

    • 任何不能轻易转换为 XML 的格式
    • 任何不能轻易识别Action / 目标方法的格式
    • REST 服务(尽管有内部支持 - 查看 MVC Web API)
    • 任何需要传输大型二进制 blob 的东西(除非 MTOM 覆盖它)
    • 需要更换多个内置组件的服务

    【讨论】:

      【解决方案2】:

      WCF 库是允许开发人员以与协议无关的方式在 WCF 和非 WCF 服务之间进行通信的库。使用 WCF 的服务开发人员不需要知道这些服务之间使用的协议的详细信息,因为这些复杂性隐藏在 WCF 绑定中。因此,服务开发人员只需正确配置他们的客户端或服务器端点/绑定/行为,这些端点/绑定/行为就可以完成所有工作。

      但是 WCF 不是一个与“任何东西”通信的通用平台。例如 NetTcpBinding 使用 TCP 套接字进行通信。 TCP 协议允许在双方之间创建一个管道,但是当这个管道建立时,TCP 没有指定或强制哪些内容应该通过这个管道发送。它可以是一些标准化的协议,例如 HTTP,也可以是 SW 开发人员发明的从未发布过的专有自定义协议。有成百上千的自定义协议可以流经 TCP,包括通过 TCP 或 IEC104 的 Modbus 等协议。例如,这 2 个协议是专门为与嵌入式设备通信而设计的,不能用作 Web 服务之间交换通用消息的协议。

      NetTcpBinding 通过 TCP 管道发送由 MS 设计的完全独立的协议,以提供与基于 NetTcpBinding 构建的 WCF 服务的有效通信。它不能用于使用某些具有不同(未知)数据序列化、时序、安全性、数据交换模式等的未知协议与您的自定义服务进行通信。

      因此,这里唯一可行的选择是使用“原始套接字”——Socket 或 TcpClient 等类与您的专有服务进行通信。但首先你必须知道你的 TCP 服务器使用的是什么协议。也许是一些标准化的协议,例如 SOAP 或 HTTP,或者是完全独立的专有协议,但从未发布或记录在案。

      尽管 WCF 有许多可扩展性选项允许开发人员扩展 WCF 库,但当您希望允许 WCF 通过其他传输协议(UDP、串行线路、共享网络路径)或向 WCF 绑定添加一些新功能,例如新的安全选项,一些扩展事务支持或日志记录。但是扩展 WCF 以与一些非 WCF 专有服务(使用一些自制协议)进行通信会效率低下(可能是不可能的)并且过于复杂。

      因此,如果您的非 WCF 服务没有使用与 NetTcpBinding 使用的协议非常接近(几乎相同)的协议,那么 WCF 在这里不是一个选项。使用Socket 或TcpClient 类。

      【讨论】:

        猜你喜欢
        • 2014-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-11
        • 2011-07-08
        • 1970-01-01
        • 2011-07-08
        • 1970-01-01
        相关资源
        最近更新 更多