2011-06-16 109 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