我想你走对了;-)
基本上,创建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