【问题标题】:WCF - calling back to client (duplex ?)WCF - 回调客户端(双工?)
【发布时间】:2011-02-13 16:08:31
【问题描述】:

我对选择哪种解决方案有疑问.. 我有一个正在运行的服务器,它正在运行一个可以从网站接收订单的服务。 多个客户端(远程计算机)以某种方式连接到该服务器。

我真的很想使用 WCF 进行所有通信,但不确定是否可行。

我不想在他们的路由器中配置所有客户端防火墙设置,所以客户端必须连接到服务器。

但是当服务器收到订单时,它应该被转移到特定的客户端。

一种解决方案可能是让客户端使用双工绑定进行连接,但它必须以某种方式保持连接处于活动状态才能从服务器接收数据...这是一个好方法吗?

通常连接超时,可能是有充分理由的......

任何人都知道这个问题。

感谢任何建议:-)

最好的问候 索伦·穆勒

【问题讨论】:

  • 小心将会话保存在场中,以及重启等操作。

标签: .net wcf .net-3.5 wcf-binding


【解决方案1】:

我做了一些研究来选择双工通信的最佳方法。我想出了以下解决方案。

带有 wsDualhttpbinding 的 WCF 服务:
如果服务器和 客户端都有公共 IP。客户端和服务器使用 http 进行通信,因此没有防火墙限制。但是在发起双工通信时,客户端必须单独连接到服务器,这样客户端也需要有公网IP。

带有 NetTcpbinding 的 WCF 服务:
这种方法使用 TCP 协议进行双工通信,如果您使用 WCF,这是可行的方法。唯一的缺点是一些防火墙阻止了 TCP 端口。在这种情况下,您需要有防火墙例外。

WCF NetHttpBinding 与 Web 套接字:
这种方法使用 http 协议,因此没有防火墙限制。在这种方法中,客户端启动 http 连接,然后升级到 TCP 连接以进行双工通信。目前只有 win 8 或 win 2012 操作系统支持 WCF web socket。所有服务器和客户端都是wind 8或win 2013,这是要走的路。

使用第三方框架(signal R、Xsocket.net)的 Web 套接字:
这不是 WCF,但您仍然可以实现 REST Web 服务或 Windows 服务应用程序。使用http协议,稍后升级到TCP进行双工通信

【讨论】:

    【解决方案2】:

    这正是双工绑定的设计目的。您有两个最佳选择是NetTcpBindingPollingDuplexBinding

    前者使用 TCP 协议,如果您的客户端不在您的网络上,则该协议可能不适合它们。但是,它确实允许通过客户端启动的套接字进行双向通信。所以客户端不需要能够接受传入的连接。我最近在一个项目中使用了它,效果很好。它也非常敏感。当客户端应用程序关闭时,服务器上的会话立即结束。

    第二个选项 PollingDuplexBinding 包含在 Silverlight SDK 中。它使用客户端发起的“长”HTTP 请求。该请求等待需要发送给客户端的消息,当它们到达时,客户端请求返回。然后客户端向服务器发起一个新的 HTTP 请求。换句话说,客户端总是有一个未决的 HTTP 请求。这在防火墙上运行良好,应该在您与 Internet 客户端打交道时使用。但是,我发现它的响应不如 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
    

    【讨论】:

    • 啊听起来不错...它是通过互联网,而且我认为 TCPBinding 听起来最好。但是为了让服务器向客户端异步发送数据,客户端需要保持连接处于活动状态。绑定是否有任何设置可以做到这一点,或者您是否需要向服务器发送心跳“消息”为了让它活着..?是否有任何关于如何为此设置好的 TCPBinding 的 App.config 示例?谢谢..:-)
    • NetTcpBinding 上有各种超时设置来控制它在没有任何活动的情况下保持打开状态的时间,但除此之外,您不需要做任何特别的事情来让它保持活动状态。我主要使用默认值。我将更新我的答案以包含我最近项目中的相关配置。
    • 我也处于同样的情况,我已经在使用双工通信的 nettcp 绑定。但我的问题是当连接数达到 800 左右时,客户端变得无响应并抛出“打开操作未在分配的 00:01:00 超时内完成。分配给此操作的时间可能是较长超时的一部分。 " IE:我正在使用循环来创建到 WCF 服务器的连接。感谢您对此问题的帮助。
    • 您好,谢谢,我设法使用 serviceThrottling 和 maxConnections 配置属性增加了客户端的最大数量。感谢那。 您知道在给定时间有多少客户端连接到您的 WCF 应用程序吗?并且最大数量的客户端可以获得连接。非常感谢您的帮助。
    猜你喜欢
    • 2010-09-30
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多