這正是雙工綁定設計用於任何意見。你有兩個最好的選擇是NetTcpBinding或PollingDuplexBinding。
前者使用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
請小心保持場中的會話,以及重啓等。 – 2010-04-29 06:34:18