2011-06-16 102 views
3

WCF服务在所有呼叫执行速度非常快之后,第一次请求需要大约5-6秒。下面的 是我的WCF服务的客户端配置。WCF启动需要太多时间

使用IIS托管。

 WSHttpBinding binding = new WSHttpBinding(); 
     binding.SendTimeout = TimeSpan.FromMinutes(1); 
     binding.OpenTimeout = TimeSpan.FromMinutes(1); 
     binding.CloseTimeout = TimeSpan.FromMinutes(1); 
     binding.ReceiveTimeout = TimeSpan.FromMinutes(1); 
     binding.AllowCookies = false; 
     binding.BypassProxyOnLocal = false; 
     binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; 

     binding.MessageEncoding = WSMessageEncoding.Mtom; 

     binding.TextEncoding = System.Text.Encoding.UTF8; 
     binding.UseDefaultWebProxy = true; 
     binding.Name = "BasicHttpBinding_ILearningService"; 


     binding.Security.Mode = SecurityMode.Transport;    
     binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; 
     binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; 
     binding.Security.Transport.Realm = ""; 

服务器端配置

<services> 
    <service behaviorConfiguration="LearningServiceServiceBehavior" name="LearningService"> 
    <host> 

     <baseAddresses> 
     <add baseAddress="https://xxxxx/LearningService.svc" /> 
     </baseAddresses> 
    </host> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="TransportSecurity" contract="ILearningSuiteService"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 

    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 
<bindings> 
    <wsHttpBinding> 
    <binding name="TransportSecurity" messageEncoding="Mtom" sendTimeout="00:1:00" openTimeout="00:2:00"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="LearningServiceServiceBehavior"> 
     <serviceMetadata httpsGetEnabled="true" httpGetEnabled="false" httpGetUrl="http://xxxxxxx/Metadata" httpsGetUrl="https://xxxxxxxx/Metadata" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

+0

您是否正在创建服务,然后立即进行第一个呼叫?问题可能是您必须等待创建服务才能拨打电话。也许你应该在初始化时这样做,以便在第一次调用时服务已经被创建。 – stuartmclark 2011-06-16 10:53:56

+0

是的,我正在创建Web服务,并在第一次通话后。我的要求就是这样。一旦程序启动,它就会请求WCF服务来获取数据。有什么办法可以改善这个时间滞后吗? – Vipul 2011-06-16 11:27:37

回答

4

您可能会看到的另一个问题是,当您使用传输安全性时,您正在客户机上进行证书验证每次你创建一个新的代理。是否有可能证书验证费用很高,比如说,由于证书的撤销清单没有及时提供?

尝试关闭安全,看看是否改变行为

+0

确实,证书验证是昂贵的,因此执行我的请求需要很长时间。但现在的问题是如何改进它,因为SSL是我的主要要求。 – Vipul 2011-07-15 05:11:18

+0

你在使用SSL进行纯粹的加密或验证服务器身份? – 2011-07-15 05:42:26

+0

我正在使用它来进行纯粹的加密。 – Vipul 2011-08-08 04:35:01

2

虽然没有完全明确的,它看起来像你是托管IIS(我说的不明确,因为不被在IIS中指定baseAddresses托管,而实际的.svc文件是该服务的基地址)

假设你是IIS主机,你是否看到了工作进程的启动时间?根据您使用的Windows版本,您可以使用Windows Server AppFabric在第一个请求之前自动启动服务

+0

每当我从客户端进行第一个呼叫时,它需要5-6秒,而不是第一个到服务器的Web服务呼叫。所以如果我重新启动客户端应用程序,它再次需要5-6秒的第一次通话。 – Vipul 2011-06-16 11:22:11

1

第一次拨打电话,客户端建立到服务器的连接,服务器也需要鉴别,这可能需要一些时间。 基于我在我的项目中发现的内容,如果您的合同非常庞大,WCF系列化可能会在第一时间花费很多时间。之后,序列化可以更快。

+0

此序列化是否需要更多时间SSL,如果是,我们如何才能减少它?我从WCF方法返回数据集,该数据集包含100个搜索项,并且大小为4-6 K。 – Vipul 2011-08-08 04:36:22