UWP中的WCF:我应该显式调用服务客户端(代理)的OpenAsync()吗?

时间:2017-06-26 13:43:40

标签: wcf uwp

我正在开发一个需要使用WCF服务器的某些服务的UWP客户端项目。我使用Visual Studio的“添加服务引用”工具来自动生成服务客户端(代理)。绑定类型为NetTcpBinding。下面是一些创建服务客户端的代码片段:

    NetTcpBinding tcpBinding = new NetTcpBinding();

    tcpBinding.Security.Mode = SecurityMode.None;
    tcpBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;
    tcpBinding.Security.Message.ClientCredentialType = MessageCredentialType.None;

    MainServiceClient = new MainServiceClient(tcpBinding, new EndpointAddress("net.tcp://localhost:8773/MyWCF/MainService/tcp"));

问题是我需要调用MainServiceClient的OpenAsync()方法吗?服务客户端似乎可以在首次调用时自动打开。但我从这个article读到,自动打开的服务客户端会有一些性能损失。这篇文章写于2007年。我只是想知道这种机制今天是否已经改变,特别是在UWP项目中。任何人都可以就此主题分享更多信息吗?谢谢!

1 个答案:

答案 0 :(得分:0)

要解释这种情况,您应该了解三种方法来进行WCF实例管理。 WCF提供了三种控制WCF服务实例的方法:Per call,Per session,Single instance。

  

当我们按照调用配置WCF服务时,会为您通过WCF代理客户端进行的每个方法调用创建新的服务实例。

     

我们经常需要在方法调用或特定会话之间维护状态。对于这些场景,我们需要为每个会话配置服务。在每个会话中,仅为会话交互创建一个WCF服务对象的实例。

     

我们通常希望为所有WCF客户端创建一个全局WCF实例。要创建WCF服务的单个实例,我们需要将WCF服务配置为单实例模式。

WCF中,有三种方法可以处理每个服务实例的并发性:单个,多个和可重入。

  

Single:单个请求在给定时刻可以访问WCF服务对象。因此,在任何给定的时刻只会处理一个请求。其他请求必须等到WCF服务处理的请求完成。

     

Multiple:在这种情况下,WCF服务对象可以在任何给定的时刻处理多个请求。换句话说,通过在WCF服务器对象上生成多个线程来同时处理请求。所以这里有很好的吞吐量,但是你需要确保与WCF服务器对象相关的并发问题。

     

可重入:单个请求线程可以访问WCF服务对象,但线程可以退出WCF服务以调用另一个WCF服务,也可以通过回调调用WCF客户端并重新进入而不会出现死锁。

在“Instance mode = Per Session and Concurrency = Single”组合中,为每个WCF客户端会话创建一个WCF服务实例,因为WCF实例模式设置为每个会话。所有方法都是按顺序逐个执行的。换句话说,只有一个线程可用于特定服务实例的所有方法调用。

对于上述方案,您应始终在进行任何调用之前明确打开WCF客户端代理。因为它将在方法调用之间维持服务状态并获得高性能。

有关详细信息,请参阅"WCF Concurrency (Single, Multiple, and Reentrant) and Throttling""Three ways to do WCF instance management"