【问题标题】:WCF service client initialisation strategyWCF服务客户端初始化策略
【发布时间】:2016-06-01 11:26:13
【问题描述】:

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

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

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

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

因此,在任何调用之前,都会创建新客户端,在操作完成后立即销毁并使用接收到的数据。

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

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

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

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

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

    当使用可靠会话或一般会话时,您当然必须存储参考。 多次调用服务时,最好存储引用,也可能不存储。更好地描述它。

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

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

    【讨论】:

    • mService.State - 这就是我要的障碍
    【解决方案2】:

    您应该查看依赖注入来获取服务引用。实际上,它与您现在所做的性能相似(即使不是相同),但它会使长期管理更容易并允许更轻松的单元测试。

    大部分 WCF 开销是连接协商,因此每次调用中的单例和新例不会真正产生巨大的差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-17
      • 1970-01-01
      相关资源
      最近更新 更多