非WCF TCP服务器的WCF绑定



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

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

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

当您处理类似SOAP的服务时,最好考虑WCF可扩展性,该服务通过标准端点(传输)使用类似XML的消息。当你"非常接近"这一点时,你通常可以弥补差异。当您不使用这些功能时,WCF将成为一个障碍,而不是一个时间节约器。例如,我将使用WCF可扩展性,如果:

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

我不会将WCF用于:

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

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

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

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

因此,这里唯一可行的选择是使用"原始套接字"——像SocketTcpClient这样的类来与您的专有服务通信。但首先您必须知道您的TCP服务器使用的是什么协议。也许它是一些标准化的协议,比如SOAP或HTTP,或者是从未发布或记录过的完全独立的专有协议。

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

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

最新更新