2010-04-29 69 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进行双工通信