我有一个旧的非WCF Windows服务,它创建一个TCPClient来连接到非WCF TCP服务器。我根本无法更改服务器应用程序。它尝试创建2个线程,一个用于从服务器读取和处理消息,另一个用于从MSMQ队列读取,处理,然后用于发送到TCP服务器。不幸的是,存在问题,有时如果网络断开,我将得到两个读或写线程的实例。线程共享相同的TCPClient连接。
希望将我的服务切换到由Windows服务托管的WCF。我知道我可以使用MSMQIntegration绑定发送方法,但我不知道如何绑定到共享TCP连接。 netTCPBinding似乎也仅限于WCF到WCF连接。有人有关于如何进行的建议吗?
理论上,这可以通过WCF的可扩展性实现,但您必须编写自定义端点,自定义消息格式化程序以及其他50个类。我建议单独实现TCP服务。
当您处理类似SOAP的服务时,最好考虑WCF可扩展性,该服务在标准端点(传输)上使用类似XML的消息。当你“非常接近”时,你通常可以修改差异。当你不使用它时,WCF成为障碍而不是节省时间。例如,如果符合以下条件,我将使用WCF可扩展性:
I*MessageInspector
)我不会使用WCF:
Action
/目标方法的格式WCF库是允许开发人员以协议无关的方式在WCF和非WCF服务之间进行通信的库。使用WCF的服务开发人员不需要知道这些服务之间使用的协议的细节,因为这些复杂性隐藏在WCF绑定中。因此,服务开发人员只需正确配置其客户端或服务器端点/绑定/行为,这些端点/绑定/行为就可以完成所有工作。
但WCF并不是一个与“任何事物”沟通的通用平台。例如,NetTcpBinding使用TCP套接字进行通信。 TCP协议允许在双方之间创建管道,但是当建立此管道时,TCP不指定或强制要通过该管道发送什么内容。它可以是一些标准化协议,如HTTP,或SW开发人员发明的专有自定义协议,从未发布过。有数百种可能通过TCP流动的自定义协议,包括通过TCP或IEC104等Modbus协议。例如,这两个协议专门设计为与嵌入式设备通信很小,不能用作在Web服务之间交换通用消息的协议。
NetTcpBinding通过TCP管道发送其自己完全独立的协议,由MS设计,以提供与NetTcpBinding构建的WCF服务的有效通信。它不能用于使用具有不同(未知)数据序列化,时序,安全性,数据交换模式等的未知协议与您的自定义服务进行通信。
所以这里唯一可行的选择是使用'原始套接字' - 像Socket
或TcpClient
这样的类与您的专有服务进行通信。但首先,您必须知道TCP服务器正在使用的协议。也许它是一些标准化的协议,如SOAP或HTTP,或完全独立的专有协议,从未发布或记录。
尽管WCF具有许多可扩展性选项,允许开发人员扩展WCF库,但是当您希望允许WCF通过其他传输协议(UDP,串行线路,共享网络路径)进行通信或添加一些时,可以使用这些可扩展性选项。 WCF绑定的新功能,如新安全选项,某些扩展事务支持或日志记录。但是扩展WCF以与某些非WCF专有服务(使用一些自制协议)进行通信将是低效的(可能是不可能的)并且过于复杂。
因此,如果您的非WCF服务没有使用与NetTcpBinding正在使用的协议非常接近(几乎相同)的协议,则WCF不是此处的选项。使用Socket
或TcpClient
课程。