8

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

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

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

工厂上的 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 服务客户端的 WPF 调用的最佳实践是什么?

提前致谢...

4

1 回答 1

12

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

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

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

就所需的时间和精力而言,第 1 步非常“昂贵”——所以这样做绝对是个好主意,然后ProjectWcfServiceFactory在代码中缓存某处的实例。

第 2 步实际上非常轻量级,因为当服务器上发生异常(然后需要从头开始重新创建)时,客户端和服务之间的通道可能会陷入“故障状态”,因此缓存实际通道本身不太理想。

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

  • 创建ChannelFactory<T>(在你的情况下ProjectWcfServiceFactory:)一次并尽可能长时间地缓存它;只做一次繁重的工作

  • 在每次通话之前根据需要创建实际的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 中快速启动和运行的书是Michele Leroux Bustamante 的Learning WCF。她涵盖了所有必要的主题,并且以一种非常容易理解和平易近人的方式。这将教您编写高质量、有用的 WCF 服务所需的一切——基础知识、中间主题、安全性、事务控制等等。

学习 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

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

编程 WCF 服务

于 2010-03-14T08:23:16.160 回答