WCF服务客户端初始化策略

时间:2016-06-01 11:26:14

标签: c# .net wcf

我有桌面应用程序,它使用WCF服务。当我实现异步WCF调用时,我的可用性得到了很大提升。

我的问题是:初始化服务客户端的最佳做法是什么?

在之前的实现中,有一个带有凭据的静态对象和一个公共方法GetClient(),它在每次调用之前创建new ServiceClient。在应用中,通常使用这种结构:

using (var svc = ServiceClientFactory.GetClient()) {
    var data = svc.CallMethod(...);
    some_application_context.specific_attribute = data;
}

所以,在任何调用之前,创建了新的客户端,在操作完成后立即销毁,并且使用了接收的数据。

我的问题是:在每次调用之前调用客户端构造函数是最佳做法吗?

我试图创建单个静态客户端对象,它在启动时初始化一次并在应用程序关闭时销毁一次,但我没有任何名义上的性能提升。

似乎它工作正常,但我想知道使用单个客户端是否有任何非常明显的障碍?什么是推荐?

2 个答案:

答案 0 :(得分:0)

这是一个广泛的问题,它取决于很多因素,也取决于我猜的风格。

当使用可靠的会话或会话时,您当然必须存储引用。 多次调用服务时,最好存储引用,否则可能不存在。当时和那里更好地描述它。

我总是存储一个引用并创建一个属性来检查客户端是否为null或处于Faulted状态。

Service.ServiceClient ShippingService
{
    get
    {
      if (mService == null || mService.State == CommunicationState.Faulted)
      {
        mService = new Service.ServiceClient("netTcpService");
        mShippingService.Open();
      }

      return mService;
    }
}

答案 1 :(得分:0)

您应该查看依赖注入以获取服务引用。实际上,如果性能与您现在所做的相同,它将是相似的,但它可以使长期管理更容易,并允许更容易的单元测试。

大多数WCF开销都是连接协商,因此每次调用时singleton vs new不会真正产生巨大的差异。