2009-04-24 93 views
22

我有一堆運行在一個IIS應用程序中的.NET Webservices。這些web服務被另一個IIS應用程序(前端)使用。第一個電話很慢,約5到10秒。之後,這只是毫秒。第一個電話被認爲是一個性能問題。ASMX Web服務緩慢的第一個請求

我們已經嘗試了一個調用所有這些webservices的應用程序,但這顯然不能解決任何問題。所以這不是默認的應用程序回收問題。我創建了一個應用程序,多次初始化服務並測量創建一個實例所需的時間。在運行此應用程序之前,我確保我的web服務應用程序已啓動/回收,然後運行該應用程序。第一次初始化需要2到4秒,其他時間僅爲毫秒。

另一個想法是,我們在Frontend應用程序中創建一個頁面,該頁面啓動所有Web服務,並且在任何用戶進入之前我們稱之爲該頁面。我不認爲這是一個優雅的解決方案,我還可以嘗試什麼?

+0

網站初始化會發生什麼? – jro 2009-04-24 08:19:08

回答

34

客戶端第一次調用webservice時遇到的延遲是由於默認情況下需要編譯用於webservice的XmlSerializers dll。這導致了最初的呼叫2-4秒。當web服務應用程序已經運行時,如果不是你有回收的話,情況就是這樣。在這種情況下,其他答案可能會有幫助。

爲了加速初始調用,您可以在編譯時創建XmlSerializers dll。您可以通過將項目構建「生成序列化程序集」設置爲打開。這會生成一個包含webservice信息的MyApplication.XmlSerializers.dll。現在初始調用降到300毫秒,大概是dll的加載。那裏的所有呼叫都需要0 ms。

在Visual Studio中,右鍵單擊您的項目並選擇「屬性」。轉到「構建」選項卡。在'Output'部分有一個選項'Generate Serialization assembly'。如果將該值更改爲「On」,則序列化程序集將在編譯期間生成。

9

第一次調用webservice時,或者第一次長時間延遲後,Web服務需要啓動。這是你看到延遲的地方。之後,它已經開始,並會很快響應通話。這是標準的Web服務行爲。

您可以將IIS配置爲keepalive = true - 這可以提高性能。

根據要求提供更多信息。

可能是序列化程序集正在運行時創建。您可以使用項目屬性窗口的「生成」窗格底部的下拉列表來更改序列化程序集的設置。

可能是因爲你已經編寫了你的​​web服務來執行大量的應用程序啓動操作,這將在第一次調用該服務的方法時發生。

它可能是該操作非常緩慢,但您然後緩存響應,這使得後續調用更快。

+0

這是一個非常好的建議。不幸的是,系統管理員有一個每日重啓策略。 – 2009-04-24 09:23:53

+1

@Smazy:你知道他們的政策推理嗎?這聽起來像他們仍然有Win95/98的恐懼。他們是否需要對所有計算機進行格式化,並且每3個月重新安裝一次操作系統? :-D – STW 2009-08-13 17:03:59

+0

嗨Praesagus,根據要求添加更多信息。 – Fenton 2010-02-23 08:09:59

4

這是典型的,因爲ASP.NET應用程序會在第一次請求時編譯並將bin \目錄加載到內存中。

事情首先要做到:

刪除所有不必要的DLL中的bin目錄。 (我見過有人發運nunit.dll)

預編譯您的ASP.NET應用程序,以便IIS不需要。請參閱「VS 2008 Web Deployment Project Support Released

2

不確定這是否會解決WS在第一次啓動時的緩慢旋轉,因爲我假設有一個正在加載的編譯和.net DLL的加載,但幾乎可以消除任何通過確保WS所在的應用程序池配置正確,未來的冷啓動。

默認情況下,IIS6在空閒狀態下經過數分鐘或「回收」事件後「重新生成」,每次都有效地重新啓動WS。如果你的服務很穩定,那麼這些都不是必需的。

確保WS擁有自己的專用應用程序池(不共享不適當的池)也是強烈建議。

5

我最近發現,在我們的ASMX文件中,我們只提到了類名。我們在每個ASMX文件的不同彙編中獲得了服務實現。這導致.NET框架掃描整個bin文件夾,尋找包含實現的程序集。隨着您的web服務應用程序的增長,這會消耗更多時間。 這不僅可以通過在ASMX定義中包含類名稱來解決,而且還可以通過程序集名稱來解決。

我們ASMX是這樣的:

<%@ WebService Language=」C#」 CodeBehind=」MyService.cs」 Class=」MyWebservice」 %>

如果將其更改爲包括包含它看起來像這樣實施裝配。這節省了我們約10%的web服務應用程序的初始負載。

<%@ WebService Language=」C#」 CodeBehind=」MyService.cs」 Class=」MyWebservice, MyWebservice.Implementation.Assembly」 %>

1

瘋測試的幾個小時後,我已經能夠減少該web服務首輪執行時間從兩個主機在相同的IP類裸露(下面300毫秒)最小....

我首先在第一次Web服務調用時經歷了2-3秒的初始延遲,而不是來自同一進程的任何後續調用非常快。

理解我的情況下延遲的關鍵是客戶端如何處理WEB代理!

這是我在app.config文件新綁定:

<basicHttpBinding> 
    <binding name="CreateContextSoap" closeTimeout="00:01:00" openTimeout="00:01:00" 
     receiveTimeout="01:00:00" sendTimeout="01:00:00" allowCookies="false" 
     bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferSize="16777216" maxBufferPoolSize="524288" maxReceivedMessageSize="16777216" 
     messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
     useDefaultWebProxy="false"> 
     <readerQuotas maxDepth="32" maxStringContentLength="1048576" maxArrayLength="16384" 
      maxBytesPerRead="65536" maxNameTableCharCount="16384" /> 
     <security mode="None"> 
     <transport clientCredentialType="None" proxyCredentialType="None" 
      realm="" /> 
     <message clientCredentialType="UserName" algorithmSuite="Default" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 

第一webcall執行我想要慢得多,因爲傳輸信道需要發現在初始化代理配置,以透明地連接到互聯網。這通常是不需要進入內網環境中,因此,我已經改變了這些結合設置,以避免使用默認代理(自動從資源管理器設置中發現的):

bypassProxyOnLocal =「假」

useDefaultWebProxy =「假「

首次通話連接時間現在減少了很多。 希望這有助於。

0

對不起,necro add,但這一直是我一直在掙扎,我想添加一些信息的圖片。 VisualStudio本身在時間上增加了一個相當大的組件。這裏是基本的測試,涉及的裸機形式的應用程序和公司服務器上的內部託管已經運行的Web服務(與生成序列化大會設置爲true,所有測試):

Running in VS, Debug: 
    First Call: 400 ms to set up client object, 450 to call function 
    Second Call: 1 ms to set up client object, 14 to call function 
Running as .exe, Release: 
    First Call: 20 ms to set up client object, 70 to call function 
    Second call: 1 ms to set up client object, 4 to call function 
Running the Debug's .exe file outside of vs: 
    First Call: 20 ms to set up client object, 80 to call function 
    Second call: 1 ms to set up client object, 4 to call function 
Running as Release within VS: 
    Similar results to Debug in VS -- very slow 

短篇小說? Visual Studio正在爲圖片添加大量時間。而不是~90毫秒,它需要近一秒。因此,如果您正在進行性能調整,請確保在Visual Studio環境外進行測試。