2011-12-17 83 views
3

我有一個使用HTTPS在IIS中託管的WCF Web服務。服務和客戶端應用程序都是用C#編寫的。客戶端應用程序所做的第一個Web服務調用需要15秒鐘才能完成。一旦完成最初的呼叫,後續呼叫在大約100毫秒內完成。爲了測試,我有一個簡單的方法:string Ping(int val);它只是回傳以字符串形式傳入的數字。.NET中的初始Web服務調用需要很長時間

奇怪的是,一個千里之外的用戶報告了這個問題,但我沒有在我的開發機器上遇到它。我只看到第一個請求需要2到3秒。現在幾乎每個客戶都報告第一個請求需要超過15秒。

這是C#客戶端的正常行爲嗎?有沒有人遇到過這個問題?

我的Web服務綁定配置如下:

<basicHttpBinding> 
    <binding 
    name="BasicHttpBinding_IMyWebSvc" 
    maxBufferSize="16777216" 
    maxReceivedMessageSize="16777216" 
    messageEncoding="Mtom"> 
    <readerQuotas 
     maxDepth="1024" 
     maxStringContentLength="262144" 
     maxArrayLength="16777216" 
     maxBytesPerRead="16777216" 
     maxNameTableCharCount="16777216" 
    /> 
    <security mode="Transport"> 
     <transport clientCredentialType="None"/> 
    </security> 
    </binding> 
</basicHttpBinding> 

編輯:這個問題會很奇怪。

我寫了一個測試客戶端,使用了除了Ping()測試方法之外什麼都沒有的修剪代理代碼。經過測試,它仍然花費了15秒以上。由於Ping()函數不需要大量緩衝區並且問題消失,因此開始更改客戶端緩衝區大小。將緩衝區大小恢復到其原始值,問題不再回來。冉真實的客戶和第一個電話在1.2秒內完成。現在我無法在我的開發PC上重現問題。

+0

你用Wireshark來看看那裏的延遲是從術語來的網絡? – 2011-12-17 18:05:01

+0

我會試一試。 – 2011-12-17 18:12:17

+0

如果您能夠從託管您的服務的網絡外部進行連接,那可能會更好。我與Jon合作,我認爲你遇到某種與網絡有關的超時問題。 – 2011-12-17 18:25:13

回答

0

在IIS上託管.NET應用程序的問題是應用程序池預熱時間。池被終止後(空閒時間或bin-files修改後),直到下一個請求才會被重新創建。您可以使用適用於IIS的IIS應用程序預熱模塊讓您的應用程序池保持活動狀態(可以使用Web平臺安裝程序進行安裝)

+0

對於AppPool來說,15秒是很長時間的熱身。 – 2011-12-17 18:09:30

+0

我以爲可能是這樣,但即使服務已經激活,延遲也會發生。 – 2011-12-17 18:11:20

+0

@ M.Babcock:是的。然而,運行在我的筆記本電腦上的簡單的asp.net mvc應用程序需要約20秒才能啓動並運行。 – Novakov 2011-12-17 18:12:48

0

如果您在客戶端使用WCF代理,生成代理管道所需的時間將使第一次通話比後續通話慢。有關更多信息,請參見此article

+0

我正在使用.NET Framework 4並使用svcutil.exe生成代理。我會查看文章,看看有沒有什麼幫助。 – 2011-12-17 19:40:57

+0

我已經在做什麼文章推薦,除了我用綁定和端點的構造函數。做了一個測試應用程序來使用沒有參數的構造函數並獲得相同的結果。 – 2011-12-17 23:37:27

0

檢查此之前的問題的答案,是ASMX服務相關,但核心問題可能是相同

ASMX Web Service slow first request

+0

上述問題的所有答案似乎都是爲了縮短服務啓動時間。我已經證實問題出在客戶端。 – 2011-12-18 22:40:11

相關問題