WCF绑定非WCF TCP服务器

问题描述 投票:0回答:2

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

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

c# vb.net wcf tcpclient
2个回答
0
投票

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

当您处理类似SOAP的服务时,最好考虑WCF可扩展性,该服务在标准端点(传输)上使用类似XML的消息。当你“非常接近”时,你通常可以修改差异。当你不使用它时,WCF成为障碍而不是节省时间。例如,如果符合以下条件,我将使用WCF可扩展性:

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

我不会使用WCF:

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

0
投票

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

但WCF并不是一个与“任何事物”沟通的通用平台。例如,NetTcpBinding使用TCP套接字进行通信。 TCP协议允许在双方之间创建管道,但是当建立此管道时,TCP不指定或强制要通过该管道发送什么内容。它可以是一些标准化协议,如HTTP,或SW开发人员发明的专有自定义协议,从未发布过。有数百种可能通过TCP流动的自定义协议,包括通过TCP或IEC104等Modbus协议。例如,这两个协议专门设计为与嵌入式设备通信很小,不能用作在Web服务之间交换通用消息的协议。

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

所以这里唯一可行的选择是使用'原始套接字' - 像SocketTcpClient这样的类与您的专有服务进行通信。但首先,您必须知道TCP服务器正在使用的协议。也许它是一些标准化的协议,如SOAP或HTTP,或完全独立的专有协议,从未发布或记录。

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

因此,如果您的非WCF服务没有使用与NetTcpBinding正在使用的协议非常接近(几乎相同)的协议,则WCF不是此处的选项。使用SocketTcpClient课程。

© www.soinside.com 2019 - 2024. All rights reserved.