代码之家  ›  专栏  ›  技术社区  ›  Burt

WCF服务客户端生存期

  •  8
  • Burt  · 技术社区  · 14 年前

    我有一个WPF应用程序,它使用WCF服务来调用服务器。

    我在代码中使用此属性访问服务

    private static IProjectWcfService ProjectService
    {
        get
        {
            _projectServiceFactory = new ProjectWcfServiceFactory();
            return _projectServiceFactory.Create();
        }
    }
    

    工厂上的创建如下

        public IProjectWcfService Create()
        {
            _serviceClient = new ProjectWcfServiceClient();
    
            //ToDo: Need some way of saving username and password 
            _serviceClient.ClientCredentials.UserName.UserName = "MyUsername";
            _serviceClient.ClientCredentials.UserName.Password = "MyPassword";
    
            return _serviceClient;
        }
    

    要访问服务方法,我使用如下内容。

    ProjectService.Save(dto);
    

    这是一个很好的方法吗?我遇到了一个无法跟踪的错误,我认为这可能与打开过多的服务客户端连接有关(这可能吗?)注意,我从不关闭服务客户机或重用它。

    wcf服务客户端的最佳做法是什么?

    事先谢谢…

    1 回复  |  直到 14 年前
        1
  •  12
  •   marc_s Anurag    14 年前

    我想你走对了;-)

    基本上,创建WCF客户端代理是一个两步过程:

    • 创建通道工厂
    • 从通道工厂创建实际通道

    步骤1在所需的时间和精力方面相当“昂贵”,因此最好只执行一次,然后缓存 ProjectWcfServiceFactory 在你的代码中。

    步骤2实际上相当轻,由于当服务器上发生异常(然后需要从头重新创建)时,客户机和服务之间的通道可能会进入“故障状态”,因此缓存实际通道本身就不太理想。

    因此,普遍接受的最佳实践是:

    • 创建 ChannelFactory<T> (在您的情况下: 项目wcfServiceFactory )一次,并尽可能长时间地将其缓存;仅进行一次重载提升

    • 创建实际 Channel (这里: IProjectWcfService )根据需要,在每次通话前。这样,您就不必担心检查它的状态并根据需要重新创建它了。

    更新: “关闭频道怎么样?”伯特问道;-)好主意!!

    接受的最佳做法是将服务呼叫包装在 try....catch....finally 阻止。棘手的部分是:在处理频道时,事情也可能会出错,因此您可能会遇到一个例外——这就是为什么将其包装在 using(....) 块不够。

    所以基本上你有:

    IProjectWcfService client = ChannelFactory.CreateChannel();
    try
    {
       client.MakeYourCall();
    }
    catch(CommunicationException ce)
    {
        // do any exception handling of your own
    }
    finally
    {
        ICommunicationObject comObj = ((ICommunicationObject)client);
    
        if(comObj.State == CommunicationState.Faulted)
        {
           comObj.Abort();
        }   
        else
        {
           comObj.Close();
        }
    }
    

    当然,您可以很好地将它包装成一个方法、一个扩展方法或者其他什么方法,这样就不必每次进行服务调用时都将其输入。

    更新:

    我一直推荐的在WCF中快速启动和运行的书是 Learning WCF 作者:Michele Leroux Bustamante。她涵盖了所有必要的话题,并且以一种非常可理解和平易近人的方式。这将教会你所有你需要知道的东西——基础知识、中间主题、安全性、事务控制等等——来编写高质量、有用的WCF服务。

    Learning WCF http://ecx.images-amazon.com/images/I/41wYa%2BNiPML._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

    更高级的主题和对WCF更深入的了解将由 Programming WCF Services 作者Juval Lowy。他深入研究了所有的技术细节和主题,并为WCF编程提供了“圣经”。

    Programming WCF Services http://ecx.images-amazon.com/images/I/41H2u13a9bL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg