【问题标题】:WCF performance improvementsWCF 性能改进
【发布时间】:2010-03-27 18:58:25
【问题描述】:

我正在开发一个 WPF 应用程序,它通过 Internet 上的 WCF 服务与服务器通信。在分析应用程序后,我注意到创建适当的 WCF 客户端代理并调用服务器会占用大量时间。

服务器上的代码已经过优化,不需要任何时间来运行,但我仍然看到从服务被调用到返回客户端有 1.5 秒的延迟。

几点说明背景:

  • 我使用 ASP.Net 成员身份来确保安全
  • 我最终会通过网站连接到相同的服务器端代码
  • 我最终希望在应用程序中获得离线支持

我确实需要尽早确定性能,因为好像应用程序需要几秒钟才能恢复,这对于我想要做的事情来说太长了。

谁能建议对我有帮助的性能提示?

【问题讨论】:

  • 您确定这些延迟不是由于网络延迟造成的吗?尝试从接收请求到发送响应的那一刻对服务进行概要分析。这可以通过实现自定义 IDispatchMessageInspector: weblogs.asp.net/paolopia/archive/2007/08/23/… 来完成
  • @Darin - 不能像我在开发环境中的本地主机上那样,但我仍然会尝试你的建议。还有其他想法吗?
  • 如果这1.5s没有被服务和网络延迟消耗掉,剩下的就是客户端应用了。
  • @Darin - 我通过分析发现 a) 0.5 秒用于关闭服务,另外 1 秒用于实际服务调用。我认为客户端和服务器之间的握手可能需要一些时间,这是最好的管理方法,您有经验吗?

标签: wcf performance web-services


【解决方案1】:

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

  • 将所有服务和数据合同隔离到各自独立的程序集中
  • 在服务器端(以实现您的服务)以及客户端都引用该程序集

这样做,您无需使用Add Service Reference 创建“通用”客户端代理,而是可以将该过程分为两个单独的步骤:

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

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

    因为您需要在客户端访问服务合同,您需要将这些合同分离到它们自己的程序集中,以便您可以在客户端引用相同的合同。创建通道工厂是昂贵的部分 - 您希望保留该通道工厂并将其放入各种共享的缓存容器(您的主窗体或其他东西)。

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

    IMyService proxy = factory.CreateChannel();
    

    此操作占用的资源要少得多,可以在每次服务调用之前执行,不会浪费太多时间。

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

【讨论】:

  • 您实际上不需要在客户端引用服务合同程序集。您可以使用svcutil.exe 生成代理并执行前面的步骤来调用服务。
猜你喜欢
  • 1970-01-01
  • 2019-12-25
  • 2015-03-21
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多