2013-07-02 66 views
3

我正在使用來自第三方的Web服務。我正在測量調用Web方法和計時網絡流量所需的時間。我發現通話時間比網絡流量長得多。使用.NET服務引用調用Web服務的開銷是多少?

我運行應用程序並使用提琴手來觀察流量,它需要46ms來打開HTTP連接隧道和951ms來發送數據。我預計這個總數大約爲1000毫秒,但是它會以1504毫秒出現。 500毫秒可能看起來並不多,但是這是通過測試服務器完成的,從我們經常看到的響應時間爲6秒的活動服務器完成,對於需要1秒鐘的網絡通話。

這是我使用來衡量網絡的方法調用

Dim service As New SupplementaryEnquiryV1PortTypeClient() 

    Dim _stopWatch As New Stopwatch() 

    _stopWatch.Start() 

    response = service.Enquiry(request) 

    _stopWatch.Stop() 

客戶端是用VB寫的.NET時間4.5

通過加入生成的客戶端的代碼,Framework版本在Visual Studio中的服務引用,我也嘗試使用svcutil.exe來生成服務引用。

我相信Web服務是用Java編寫的,但我無法訪問代碼。該服務返回有關我假設從數據庫中提取的單個車輛的數據。

我試過使用不使用SSL的服務終點,這沒有什麼區別。

我已經嘗試將System.ServiceModel.ClientBase(Of T)上的CacheSetting屬性設置爲AlwaysOff和AlwaysOn,並且都沒有任何區別。我也嘗試將項目的「生成序列化程序集」設置爲On。

我用traceroute來檢查任何網絡相關的問題。

從小提琴手:

CONNECT uat-wss.xxx.co.uk:443 HTTP/1.1 

ClientConnected: 15:23:20.011 
ClientBeginRequest: 15:23:20.027 
GotRequestHeaders: 15:23:20.027 
ClientDoneRequest: 15:23:20.027 
Determine Gateway: 0ms 
DNS Lookup: 29ms 
TCP/IP Connect: 18ms 
HTTPS Handshake: 20ms 
ServerConnected: 15:23:20.074 
FiddlerBeginRequest: 15:23:20.074 
ServerGotRequest: 15:23:20.074 
ServerBeginResponse: 00:00:00.000 
GotResponseHeaders: 00:00:00.000 
ServerDoneResponse: 00:00:00.000 
ClientBeginResponse: 15:23:20.074 
ClientDoneResponse: 15:23:20.074 

Overall Elapsed: 0:00:00.046 

POST /TradeSoap/services/SupplementaryEnquiryV1/ HTTP/1.1 

ClientConnected: 15:23:20.011 
ClientBeginRequest: 15:23:20.105 
GotRequestHeaders: 15:23:20.105 
ClientDoneRequest: 15:23:20.464 
Determine Gateway: 0ms 
DNS Lookup: 0ms 
TCP/IP Connect: 0ms 
HTTPS Handshake: 0ms 
ServerConnected: 15:23:20.074 
FiddlerBeginRequest: 15:23:20.464 
ServerGotRequest: 15:23:20.464 
ServerBeginResponse: 15:23:20.479 
GotResponseHeaders: 15:23:20.994 
ServerDoneResponse: 15:23:21.041 
ClientBeginResponse: 15:23:21.041 
ClientDoneResponse: 15:23:21.057 

Overall Elapsed: 0:00:00.951 

編輯

至於建議的USR我已經把代碼通過探查。我在2012年使用了內置的一個(見下文)。它看起來像Microsoft.Xml.Serialization.ArrayOfObjectsSerializer1.Deserialize佔用了很多時間。什麼可能導致這需要幾秒鐘?

Profile Summary

+0

Web服務做什麼?它可能是處理數據和/或訪問需要時間在服務器上的數據庫嗎?另外,你的小提琴手從開始到回覆的痕跡是什麼樣的?握手的46 ms結束,最後發送的數據包的951 ack,第一個迴應包,???最後一個響應包的確認? (以及發送和響應數據有多大?) – 2013-07-02 13:42:10

+0

我已經更新了問題以包含提琴手響應。我對Web服務的作用並不是很感興趣,因爲我無法控制這一點。我想知道爲什麼需要這麼長時間才能創建SOAP請求並接收SOAP響應。 – user1069816

+0

打開一個分析器,或在滿載情況下將調試器暫停10次。在代碼花費時間的地方回答問題非常簡單。 – usr

回答

1

你可能會痛苦,因爲你的客戶端(VB.Net應用程序)是不開放給服務兩個以上的併發連接。

如果您有10個併發請求到page.aspx,並且此頁面對每個請求執行一次服務調用,則基本上需要10個併發Web服務調用。

但是,默認情況下,Asp.Net會將同一個目標的併發http調用數量限制爲兩個。因此,在這個假設情況下,10個頁面請求中的兩個將主動調用該服務,另外8個將等待輪到他們。當前兩個完成時,兩個新的將打電話給服務等。

您可以控制這種使用web.config設置:

<system.net> 
    <connectionManagement> 
     <add address="http://address.of.service/here" maxconnection="10"/> 
    </connectionManagement> 
</system.net> 

又見herehere或只是谷歌爲system.net connectionmanagement maxconnection,並必須通過結果看看。

不過請注意,通過顯著增加這個數字,你就會把更多的壓力,第三方服務...

還要注意的是改變maxconnection不會提高任何單個服務調用的性能,但它可能提高生產環境中的性能,在該環境中,由於到VB.Net站點的傳入流量較多,因此需要多次併發的服務呼叫。

+0

現在我再次讀到這個問題,我注意到無處不在那裏提到了Asp.Net。 '默認最大2連接'也會影響Windows應用程序,但由於傳入請求產生的'流量較大'原因當然不太可能是這種情況。我會讓反應站在反正的情況下,以防萬一它可以用... – user1429080

+0

我讀http://msdn.microsoft.com/en-us/library/ff647813.aspx建議設置maxconnection 12 *#的CPU。所以我在Web服務器上將此值設置爲24。我將繼續監測,看看這是否改善了時代。 – user1069816

+0

我今天檢查了生產環境,不幸的是這並沒有解決緩慢的反應。將maxconnection設置得太低可能會導致速度緩慢,所以我將它保留在24。 – user1069816

2

你可能會看到Nagle算法的影響,嘗試:

this.webRequest.UseNagleAlgorithm.ServicePoint = false; 

此外,Expect100Continue '握手' 是有關SOAP服務呼叫性能:

this.webRequest.Expect100Continue.ServicePoint = false; 

內格爾將停止短時間發送網絡數據包,試圖發送更少但更大的數據包。在公共互聯網上交流時,使用這可能是一種禮節。做你自己的研究。

Expect100Continue將阻止SOAP請求XML在初始HTTP PUT/POST上發送,服務器將發送OK/CONTINUE,然後客戶端將發送SOAP請求XML。這種額外的握手(兩次完整的往返行程)也會導致延遲。

+0

我嘗試了ServicePointManager.UseNagleAlgorithm = false,但這似乎並沒有改善時間。 ServicePointManager.Expect100Continue = false似乎提供了輕微的改進,因此我將其添加到代碼中。 但是我更感興趣的是沒有被用於網絡訪問的時間。似乎我花費了相當多的時間,我正在準備發送請求或閱讀響應,而我不知道爲什麼需要這麼長時間。 – user1069816

+0

不幸的是,所有內置的.Net中的序列化/反序列化過程都非常緩慢,並且依據您的分析器結果,我認爲這就是您的問題所在。你的'請求'參數是什麼類型的對象?我懷疑,如果你使用XmlDocument或XDocument,那麼你會側步緩慢的對象序列化 - 值得一試。我們在這裏寫了自己的代碼來完成SOAP調用,部分原因是由於這個問題。 – redcalx

+0

該請求是一個非常簡單的對象,只需提供身份驗證信息,車輛的註冊牌號和所需的響應類型。對於很多非常詳細的車輛信息,反應要複雜得多。我確實感覺到我最終會爲這個肥皂呼叫寫我自己的課程。 – user1069816