2012-03-27 80 views
1

我正在嘗試在與第三方應用程序通信的wcf服務中託管TCP客戶端連接。 WCF服務將tcp調用包裝到第三方應用程序,以便連接到WCF服務的任何應用程序都不知道TCP連接。由於第三方應用程序需要的協議,tcp連接必須保持活動狀態。我已經實現了處理錯誤和重新連接的邏輯,但是我遇到的問題是如何打開和關閉此連接。有沒有辦法讓我重寫主機打開和關閉的呼叫,以便我可以對我的CommunicationService做同樣的事情?TCP Keep Alive連接託管在WCF中

我的代碼:

public partial class HostService : ServiceBase 
{ 
    private ServiceHost _host; 

    public HostService() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
     Type serviceType = typeof(MessageProcessor); 
     var serviceUri = new Uri("http://localhost:9091/"); 
     _host = new ServiceHost(serviceType, serviceUri); 
     _host.Open(); 
    } 

    protected override void OnStop() 
    { 
     _host.Close(); 
    } 
} 

[ServiceContract] 
public interface IMessageProcessor 
{ 
    [OperationContract] 
    void ProcessMessage(string message); 
} 

public class MessageProcessor : IMessageProcessor 
{ 
    //This is handling my TCP connection. 
    private CommunicationService _communicationService; 

    public MessageProcessor() 
    { 
     _communicationService = new CommunicationService(); 
    } 

    public void ProcessMessage(string message) 
    { 
     if(_communicationService.Connected) 
     { 
      var request = new QueryMessage(); 
      var result = _communicationService.TransmitMessage(request); 
     } 
     else 
     { 
      //Error handling, not necessary for now 
     } 
    } 
    //I want to do this 
    public override Open() 
    { 
     _communicationService.Open(); 
    } 
    public override Close() 
    { 
     _communicationService.Close(); 
    } 
} 
+0

當兩個客戶端(因此兩個線程)試圖同時調用您的ProcessMessage方法(原則上是您的TCP連接)時,您會發生什麼? – 2012-03-27 14:42:12

+0

你使用什麼InstanceContextMode來爲你的服務?這將大大決定MessageProcessor的生命週期和潛在多個實例。 – GazTheDestroyer 2012-03-27 15:06:01

+0

KirkWoll,我的通信類中有邏輯來處理多線程。我排隊消息並根據其類型給予優先級。 GazTheDestroyer,恐怕我不確定你指的是什麼,這是我第一次使用WCF。我在做什麼不理想?有一個更好的方法嗎? – jtiger 2012-03-27 17:13:18

回答

2

時候你應該安裝/拆掉你的TCP連接取決於在創建/配置時,有多少你的服務對象(MessageProcessor的)對。

WCF非常靈活,可以處理許多不同的模型。這些由您的服務的InstanceContextMode和ConcurrencyMode控制。這些可以在您的配置文件中或在創建服務時在代碼中設置。

InstanceContextMode控制何時創建服務對象。有三種選擇。

1)每個呼叫。客戶端每次調用其中一個服務方法時,都會創建一個新的MessageProcessor實例。即使調用兩個方法的客戶端相同,您也會得到兩個MessageProcessor對象。這是默認設置。

2)每個會話:一些傳輸(如TCP)支持可靠的會話。客戶端連接將啓動一個新的會話,並創建一個MessageProcessor對象的實例。客戶端可以調用多種方法,同一個實例將處理它們。當客戶端斷開時,對象將被銷燬。請注意,許多客戶端仍然會導致許多MessageProcessor對象(每個客戶端都有自己的會話)。

3)單個:所有服務調用都使用MessageProcessor對象的相同實例。只要服務主機還活着,對象就會一直存在。

併發模式控制允許多少個線程進入同一服務對象。例如,使用Single instanceContext,您可能允許在不同線程上同時處理多個客戶端調用,或者,如果線程不安全,您可能希望強制WCF一次只允許一個線程進入MessageProcessor。

由於您希望只要客戶端需要TCP連接,它取決於您使用的InstanceContextMode在何處以及如何連接/斷開TCP連接。例如,如果使用Single模式,則只需在創建服務主機時進行連接,並在主機關閉時斷開連接。如果使用Per Call模式,當所有服務對象被銷燬時,您可能會斷開連接,或者等待很短的時間以防其他呼叫進入。這真的取決於您。

+0

感謝您的解釋。我使用Single作爲InstanceContextMode,並且只允許WCF一次處理單個呼叫。似乎到目前爲止工作! – jtiger 2012-03-28 14:32:57

相關問題