Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非WCF TCP服务器的WCF绑定_C#_Vb.net_Wcf_Tcpclient - Fatal编程技术网

C# 非WCF TCP服务器的WCF绑定

C# 非WCF TCP服务器的WCF绑定,c#,vb.net,wcf,tcpclient,C#,Vb.net,Wcf,Tcpclient,我有一个旧的非WCF Windows服务,它创建了一个TCPClient以连接到非WCF TCP服务器。我根本无法更改服务器应用程序。它尝试创建两个线程,一个用于从服务器读取和处理消息,另一个用于从MSMQ队列读取、处理消息,然后发送到TCP服务器。不幸的是,存在问题,有时如果网络断开,我会得到两个读线程或写线程实例。这些线程共享相同的TCPClient连接 希望将我的服务切换到由Windows服务托管的WCF。我知道我可以将MSMQIntegration绑定用于发送方法,但我不确定如何绑定到共

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


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

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

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

  • 我有一个SOAP服务,它需要在SMTP或其他一些奇怪的传输(自定义端点)上运行
  • 我有一个在标准端点上运行的自定义xml格式(
    I*MessageInspector
  • 我有一个自定义格式,可以在标准端点(自定义消息编码器)上轻松转换为XML
我不会将WCF用于:

  • 不容易转换为XML的任何格式
  • 不容易识别
    操作
    /target方法的任何格式
  • REST服务(尽管有内部支持——请看MVC Web API)
  • 任何需要传输大型二进制blob的内容(除非MTOM覆盖)
  • 必须更换多个内置组件的服务

WCF library是一个允许开发人员以协议无关的方式在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