2010-04-29 76 views
3

我有一個問題,選擇什麼解決方案.. 我有一個服務器運行有一個服務運行,可以接收來自網站的命令。 對於這臺服務器,多個客戶端(遠程計算機)以某種方式連接。WCF - 回撥客戶端(雙面?)

我真的想使用WCF的所有通信,但不知道這是可能的。

我不想在其路由器中配置所有的客戶端防火牆設置,所以客戶端將不得不連接到服務器。

但是,當訂單在服務器上收到時,它應該被轉移到特定的客戶端。

一個解決方案可能是讓客戶端使用雙工綁定進行連接,但它必須以某種方式保持連接處於活動狀態,以便能夠從服務器接收數據......這是一種很好的方法嗎? ?

通常情況下,連接超時,可能是一個很好的理由......

任何人都有洞察到這一問題。

THX很多的:-)

問候 瑟倫穆勒

+1

請小心保持場中的會話,以及重啓等。 – 2010-04-29 06:34:18

回答

4

這正是雙工綁定設計用於任何意見。你有兩個最好的選擇是NetTcpBindingPollingDuplexBinding

前者使用TCP協議,如果它們不在您的網絡上,可能不適合您的客戶端。但是,它確實允許通過客戶端啓動的套接字進行雙向通信。所以客戶端不需要能夠接受傳入的連接。我最近在一個項目中使用了它,它工作得很好。它也非常敏感。當客戶端應用程序關閉時,服務器上的會話立即結束。

第二個選項PollingDuplexBinding包含在Silverlight SDK中。它使用客戶端發起的「長」HTTP請求。請求等待消息發送到客戶端,當客戶端到達時,客戶端請求返回。客戶端然後發起一個新的HTTP請求回到服務器。換句話說,客戶端總是有一個掛起的HTTP請求。這適用於防火牆,應在與互聯網客戶端打交道時使用。但是,我發現這不像NetTcpBinding那樣敏感。我可能一直在做一些錯誤的事情,但似乎嘗試將回調傳遞給已放棄的客戶端會話需要一段時間才能「超時」。


下面是我最近使用NetTcpBinding進行雙工通信的項目中的配置文件示例。請注意,除了一些調整服務調節,我幾乎使用默認的這個綁定。但是there's all kinds of things你可以調整,如receiveTimeout,inactivityTimeout等

<configuration> 
    <system.serviceModel> 

     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 

     <behaviors> 
      <serviceBehaviors> 
       <behavior name=""> 
        <serviceMetadata httpGetEnabled="true" /> 
        <serviceDebug includeExceptionDetailInFaults="true" /> 
        <serviceThrottling maxConcurrentCalls="65535" 
             maxConcurrentSessions="65535" 
             maxConcurrentInstances="65535" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 

     <bindings> 
      <netTcpBinding> 
       <binding maxConnections="65535"> 
        <security mode="None" /> 
       </binding> 
      </netTcpBinding> 
     </bindings> 

     <services> 
      <service name="BroadcastService"> 
       <endpoint address="" binding="netTcpBinding" contract="BroadcastService" /> 
      </service> 
     </services> 

    </system.serviceModel> 
</configuration> 

[ServiceContract(CallbackContract = typeof(IBroadcastCallback))] 
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class BroadcastService : IDisposable 
{ 

    [OperationContract(IsInitiating=true)] 
    public long Subscribe(Guid clientID) 
    { 
     // clients call this to initiate the session 
    } 

    [OperationContract(IsOneWay = true)] 
    public void Publish(BroadcastMessage message) 
    { 
     // client calls this to broadcast a message to 
     // all other subscribed clients via callback 
    } 

} 

[ServiceContract(Name = "BroadcastCallback")] 
public interface IBroadcastCallback 
{ 

    [OperationContract(IsOneWay = true, AsyncPattern = true)] 
    IAsyncResult BeginBroadcast(BroadcastMessage Message, AsyncCallback callback, object state); 

    void EndBroadcast(IAsyncResult asyncResult); 

} // interface 
+0

啊啊聽起來不錯... 它是在互聯網上,因爲它似乎我認爲TCPBinding聽起來最好。 但爲了讓服務器發送數據到客戶端異步,連接需要保持活着的客戶端.. 是否有任何設置的綁定來做伎倆,或者你需要發送心跳「消息」到服務器,以保持活着..? 做有任何App.config例如如何設置一個良好的TCPBinding? Thx .. :-) – 2010-04-30 14:53:37

+0

NetTcpBinding上有各種超時設置,控制在沒有任何活動的情況下它將保持打開狀態的時間長度,但除此之外沒有什麼特別的事情需要保持活動狀態。我主要使用默認值。我會更新我的答案,以包含來自我最近項目的相關配置。 – Josh 2010-04-30 19:49:51

+0

我也在同一種情況下,我已經使用nettcp綁定與雙工通信。但我的問題是當連接數達到800客戶端變得沒有響應時,並且拋出「00:01:00分配的超時內沒有完成打開操作。分配給此操作的時間可能是更長超時的一部分。 「 IE:我正在使用循環來創建到WCF服務器的連接。感謝您對此問題的幫助。 – Mahesh 2013-06-14 06:35:12

0

我已經做了研究位選擇進行雙工通信最好的辦法。我想出了以下解決方案。與wsDualhttpbinding

WCF服務:
這種做法是好的,如果服務器和客戶端 有兩個公網IP。客戶端和服務器使用http進行通信,因此沒有防火牆限制但是,當啓動雙工通信客戶端必須與服務器分開連接時,客戶端也需要具有公共IP。

與NetTcpBinding的WCF服務:
這種方法使用的雙工通信的TCP協議,這是方式,如果你正在使用WCF去。唯一的缺點是一些防火牆阻止TCP端口。在這種情況下,你需要有防火牆例外。

WCF NetHttpBinding與網絡插口:
這種方法使用HTTP協議,沒有防火牆的限制。在這種方法中,客戶端啓動http連接,然後升級到TCP連接進行雙工通信。此刻只贏得8個或贏得2012年操作系統支持WCF網絡套接字。所有的服務器和客戶都是風8或勝2013,這是要走的路。
這不是一個WCF,但仍可以實現REST Web服務或Windows服務應用程序:使用第三方框架(信號R,Xsocket.net)

網絡插座。使用http協議,稍後升級到TCP進行雙工通信