2010-03-27 80 views
1

我正在开发一个WPF应用程序,通过互联网通过WCF服务与服务器通信。在分析应用程序之后,我注意到通过创建适当的WCF客户端代理并调用服务器,正在占用大量时间。WCF性能改进

服务器上的代码已经过优化,并且不需要任何时间运行我仍然看到从服务启动到返回客户端时的延迟1.5秒。

有几点给一点背景知识:

  • 我使用ASP.Net会员安全
  • 我最终将通过一个网站挂接到同一个服务器端代码
  • 我最终会喜欢在应用程序中有离线支持

我真的需要尽早指出性能,尽管应用程序需要几秒钟才能回来它太离谱了克为我正在尝试做什么。

任何人都可以提出性能提示,这将帮助我吗?

+2

您确定这些延迟不是由于网络延迟造成的吗?尝试从收到请求的那一刻开始分析服务,并在发送响应的那一刻进行分析。这可以通过实现一个自定义的'IDispatchMessageInspector'完成:http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf-message-inspector.aspx – 2010-03-27 19:01:18

+0

@Darin - 它可以'不要因为我在开发环境中的本地主机上,我仍然会尝试你的建议。 有没有其他想法? – Burt 2010-03-27 20:49:59

+0

如果这个1.5s没有在服务和网络延迟中消耗,剩下的就是客户端应用程序。 – 2010-03-27 21:02:57

回答

1

WCF中的客户端代理基本上由两部分组成。如果您控制通信的两端 - 例如 - 如果你写的服务器和客户端您可以通过以下步骤优化这个:

  • 隔离所有服务和数据合同到自己单独的程序
  • 引用,大会在服务器端(实现您服务),以及客户端

这样做,你不需要使用Add Service Reference创建一个“通用”客户端代理,而是,你可以拆解该进程进入两个单独的步骤:

  • 第一步是使用您的服务合同创建ChannelFactory<T>,例如,

    ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>(); 
    

    因为你需要访问在客户端的服务合同,则需要将这些合同进行分成自己组装,这样你可以参考在客户端相同的合同。创建渠道工厂是一个昂贵的部分 - 你想挂在那个渠道工厂,并把它放到一个共享的,缓存的各种容器(你的主窗体或其他东西)中。

  • 所述第二步骤是从通道工厂创建实际的信道(“代理”):

    IMyService proxy = factory.CreateChannel(); 
    

    该操作要少得多的资源密集的,并且可以每个服务调用和不应该”之前进行不会浪费大量时间。

因此,通过几个基本步骤,您应该能够显着简化并加快构建服务客户端代理。

+1

您实际上不需要在客户端引用服务合约程序集。您可以使用'svcutil.exe'生成代理并执行前面的步骤来调用服务。 – 2010-03-28 06:27:11