为什么第一个WCF客户端调用慢?为什么第一个WCF客户端调用慢?(Why is the first

2019-05-16 22:21发布

我试图找出为什么客户端应用程序开始后的第一个WCF调用花费更多的时间与第二个。

我所做的测试是:

  1. 实现简单的自承载的WCF服务器和控制台客户端。
  2. 服务器是热身 -我运行它,并运行测试之前调用方法多次。
  3. 绑定是basicHttpBinding减少网络和安全的开销。
  4. 测试场景 - 启动控制台客户端应用程序,使得在连续两个相同的WCF服务电话。

在我的测试中,我看到〜700毫秒的第一个电话和〜3毫秒的第二个电话。

几乎是第二似乎是JIT编译器太多时间。 如果时间用于初始化像一些复杂的基础设施我会接受ObjectContext实体框架,但我的代码是非常简单和代理类已经被编译。

我也试过netNamedPipeBinding结合。 结果证明图案 - 第一呼叫发生〜800毫秒,第二呼叫花费〜8毫秒。

将不胜感激,如果任何人都可以解释为什么第一个服务调用花费这么多的时间。

测试在Win 7 64位。

我的实现如下。

合同:

[ServiceContract]
public interface ICounter
{
        [OperationContract]
        int Add(int num);
}

服务实现:

public class CounterService: ICounter
{
        private int _value = 0;

        public int Add(int num)
        {
            _value += num;
            Console.WriteLine("Method Add called with argument {0}. Method  returned {1}", num, _value);
            return _value;
        }
}

服务器实现:

class Program
{
    static void Main(string[] args)
    {
        Uri baseAddress = new Uri("http://localhost:8080/Service");

        // Create the ServiceHost.
        using (ServiceHost host = new ServiceHost(typeof(CounterService), baseAddress))
        {
            host.Open();

            Console.WriteLine("The service is ready at {0}", baseAddress);
            Console.WriteLine("Press <Enter> to stop the service.");
            Console.ReadLine();

            // Close the ServiceHost.
            host.Close();
        }
    }
}

服务器配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Server.CounterService">
        <endpoint address="base" binding="basicHttpBinding" name="baseDefault"
          contract="Contract.ICounter" />
        <endpoint address="net.pipe://localhost/Service/netNamedPipe"
          binding="netNamedPipeBinding" name="netNamedPipeDefault" contract="Contract.ICounter" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

客户端执行( CounterProxy从服务引用生成):

Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();

using (var proxy = new CounterProxy.CounterClient(_endpointConfigurationName))
{
    output = proxy.Add(1);
}

stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;

包含代码功能连续叫两次。

客户端配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint address="http://localhost:8080/Service/base" binding="basicHttpBinding"
          contract="CounterProxy.ICounter"
          name="baseDefault" />
    </client>
  </system.serviceModel>
</configuration>

Answer 1:

通常,第一个电话需要花费更多的时间,因为在调用该Channel Factory被实例化和准备准备好通信和耗费时间。 创建的Channel Factory将被缓存并在后续调用重复使用,因此时间会少一些。

http://social.msdn.microsoft.com/Forums/en/wcf/thread/43f89088-546b-46b0-adf8-214deb1741bd



Answer 2:

我有类似的问题。 所以,我们真正的所作所为,我们写了服务,每间隔一定调用WCF服务。 我知道,这不是一个完美的解决方案,但它的工作。



Answer 3:

如果您正在为您的WCF服务调用次数少于15秒(我们观察到需要等待大约20秒在我们的应用程序),微软的博客上解释你的问题: http://blogs.msdn.com/b/wenlong /archive/2010/02/11/why-does-wcf-become-slow-after-being-idle-for-15-seconds.aspx

文章还链接到该条目,其中提到了SetMinThreads修复(),这也似乎是一个促进问题: http://blogs.msdn.com/b/wenlong/archive/2010/02/11/why-are- WCF的反应慢,和setminthreads -不-不work.aspx



Answer 4:

我看到在30秒范围内的延迟,当我第一次创造,我知道必须与某种网络超时的我的服务代理实例。

在结束对我来说是真正的证书吊销列表检查了正在这里强调阻止或挫败由企业代理(耶的Websense): WCF服务的启动速度太慢? 你有没有想过到CRL检查? 。

对于未来的参考和情况下,链接去死它来到了添加以下的客户端配置:

<configuration>
  <runtime>
    <generatePublisherEvidence enabled=“false”/>
  </runtime>
</configuration>


文章来源: Why is the first WCF client call slow?