gpt4 book ai didi

WCF 服务客户端生命周期

转载 作者:行者123 更新时间:2023-12-04 06:28:41 25 4
gpt4 key购买 nike

我有一个 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 调用的最佳实践是什么?

提前致谢...

最佳答案

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

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

  • 创建 channel 工厂
  • 从 channel 工厂,创建实际 channel

  • 就所需的时间和精力而言,第 1 步非常“昂贵” - 因此执行一次然后缓存 ProjectWcfServiceFactory 的实例绝对是个好主意。在您的代码中的某处。

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

    因此,普遍接受的最佳实践是:
  • 创建 ChannelFactory<T> (在您的情况下: ProjectWcfServiceFactory )一次并尽可能长时间地缓存它;只做一次繁重的工作
  • 创建实际 Channel (此处: IProjectWcfService )根据需要,在每次通话之前。这样,您就不必担心检查其状态并根据需要重新创建它

  • 更新: “关闭 channel 怎么样?”伯特问 ;-) 好点!!

    公认的最佳做法是将您的服务调用包含在 try....catch....finally 中。堵塞。棘手的部分是:在处理 channel 时,事情也可能会出错,因此您可能会遇到异常 - 这就是将其包装在 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

    Programming WCF Services 将涵盖更高级的主题和更深入的 WCF 研究。作者:朱瓦尔·洛伊他真的深入研究了所有技术细节和主题,并为 WCF 编程提供了“圣经”。

    Programming WCF Services

    关于WCF 服务客户端生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2440608/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com