簡體   English   中英

非WCF TCP服務器的WCF綁定

[英]WCF Binding for non-WCF TCP Server

我有一個舊的非WCF Windows服務,該服務創建一個TCPClient來連接到非WCF TCP服務器。 我根本無法更改服務器應用程序。 它嘗試創建2個線程,一個用於讀取和處理來自服務器的消息,另一個用於從MSMQ隊列讀取,處理,然后發送到TCP服務器。 不幸的是,有問題,有時如果網絡斷開,我將獲得兩個讀或寫線程實例。 這些線程共享相同的TCPClient連接。

希望將我的服務切換到Windows服務托管的WCF。 我知道我可以將MSMQIntegration綁定用於send方法,但是我不確定如何綁定到共享TCP連接。 netTCPBinding似乎也僅限於WCF到WCF的連接。 有人對如何進行有建議嗎?

從理論上講,使用WCF的可擴展性是可行的,但是您必須編寫一個自定義終結點,一個自定義消息格式化程序以及其他五十個類。 我建議單獨實施TCP服務。

當您處理在標准端點(傳輸)上使用類XML消息的類SOAP服務時,最好考慮WCF可擴展性。 當您“非常接近”時,通常可以修補差異。 當您不使用這些功能時,WCF就會成為障礙,而不是節省時間。 例如,在以下情況下,我將使用WCF可擴展性:

  • 我有一個需要通過SMTP或其他一些奇怪的傳輸(自定義端點)運行的SOAP服務。
  • 我有在標准端點( I*MessageInspector )上運行的自定義xml格式
  • 我有一個自定義格式,可以將其輕松轉換為在標准端點(自定義消息編碼器)上運行的XML

我不會將WCF用於:

  • 任何不易轉換為XML的格式
  • 任何無法輕易識別Action / target方法的格式
  • REST服務(盡管有內部支持-請查看MVC Web API)
  • 任何需要傳輸大型二進制Blob的內容(除非MTOM覆蓋了它)
  • 需要替換多個內置組件之一的服務

WCF庫是允許開發人員以協議不可知的方式在WCF和非WCF服務之間進行通信的庫。 使用WCF的服務開發人員無需知道這些服務之間使用的協議的詳細信息,因為這些復雜性隱藏在WCF綁定中。 因此,服務開發人員只需正確配置其客戶端或服務器端點/綁定/行為,這些端點/綁定/行為就可以完成所有工作。

但是WCF並不是一個與“任何事物”進行通信的通用平台。 例如,NetTcpBinding使用TCP套接字進行通信。 TCP協議允許在雙方之間創建管道,但是當建立此管道時,TCP不會指定或要求通過該管道發送什么內容。 它可以是某些標准協議(例如HTTP),也可以是SW開發人員從未發布的專有自定義協議。 可能有成百上千的自定義協議可以流經TCP,包括通過TCP或IEC104的Modbus之類的協議。 例如,這兩個協議經過特殊設計,以使其與嵌入式設備進行通信時很小,因此不能用作在Web服務之間交換通用消息的協議。

NetTcpBinding通過TCP管道發送它自己的完全獨立的協議,該協議由MS設計,以提供與基於NetTcpBinding的WCF服務的有效通信。 它不能用於使用具有不同(未知)數據序列化,時序,安全性,數據交換模式等的未知協議與您的自定義服務進行通信。

因此,這里唯一可行的選擇是使用“原始套接字”-諸如SocketTcpClient類的類與您的專有服務進行通信。 但是首先,您必須知道您的TCP Server使用什么協議。 也許這是一些從未發布或記錄過的標准化協議,例如SOAP或HTTP或完全獨立的專有協議。

盡管WCF具有許多可擴展性選項,允許開發人員擴展WCF庫,但是當您希望允許WCF通過其他傳輸協議(UDP,串行線,共享網絡路徑)進行通信或添加一些擴展性選項時,仍應使用這些可擴展性選項。 WCF綁定的新功能,例如新的安全性選項,一些擴展的事務支持或日志記錄。 但是,將WCF擴展為與某些非WCF專有服務(使用某些自制協議)進行通信將效率低下(可能是不可能的)並且過於復雜。

因此,如果您的非WCF服務未使用與NetTcpBinding正在使用的協議非常接近(實際上相同)的協議,則此處不是WCF選項。 使用SocketTcpClient類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM