2010-03-14 171 views
8

我有一个使用WCF服务来调用服务器的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; 
    } 

要访问我用somethingn类似下面的服务的方法。

ProjectService.Save(dto); 

这是一个很好的方法,我正在尝试做什么?我遇到了一个错误,我无法追查到,我认为可能意味着打开了太多的服务客户端连接(这是可能的吗?)通知我从不关闭服务客户端或重新使用它。

WCF服务客户端的最佳做法是WPF调用?

在此先感谢...

回答

11

你在正确的轨道上,我会说;-)

上讲,创建WCF客户端代理是一个过程分为两个步骤:

  • 创建从通道工厂通道工厂
  • ,创建实际的信道

步骤#1在所需的时间和精力方面相当“昂贵” - 因此,一次只做一次,然后在您的代码中某处缓存ProjectWcfServiceFactory的实例是一个好主意。

步骤#2实际上非常轻便,并且由于服务器发生异常(然后需要从头开始重新创建)时,客户端和服务之间的通道可能会陷入“故障状态”,缓存实际的频道本身不太理想。

所以普遍接受的最好的做法是:

  • 创建ChannelFactory<T>(你的情况:ProjectWcfServiceFactory)一次,并缓存它尽可能长的时间;只做一次

  • 根据需要创建实际的Channel(在每次调用之前)。这样,你就不必担心检查其状态并重新创建它需要

UPDATE:“?关于关闭通道是什么”问Burt ;-)好点!

为此接受的最佳实践是将您的服务呼叫包装在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(); 
    } 
} 

,当然还有,你绝对可以很好地包装成一个方法或为了不每次制作服务的时间把这个打出来的扩展方法或某事,这呼叫。

UPDATE:

这本书我总是建议起床和WCF快速运行是Learning WCF由米歇尔·勒鲁布斯塔曼特。她涵盖了所有必要的主题,并且以一种非常容易理解和平易近人的方式。这将教会你需要知道的一切 - 基础知识,中级主题,安全性,事务控制等等 - 编写高质量,有用的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由朱瓦尔·洛覆盖。他真的深入了解所有技术细节和主题,并为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

+0

如何关闭频道? – Burt 2010-03-14 08:44:13

+0

谢谢,这已经清除了一些东西,我真的需要购买WCF书(任何建议都会受到欢迎)。 – Burt 2010-03-14 22:06:17

+0

为什么catch和最后基本上做同样的事情,即comObj.Abort? 有没有必要在捕获中放弃? – Burt 2010-03-14 23:20:39