2013-10-30 26 views
0

我面臨着與Web服務請求的處理接下來的問題:Web服務的併發呼叫的處理

序言
在IIS 7.0上我已經

  • 的Web API服務託管在本地機器上
  • 測試線束控制檯在同一臺機器上的應用

,我試圖通過點擊測試工具應用生成的請求來模擬Web服務負載。 測試工具的核心代碼:

static int HitsCount = 40; 

    static async void PerformHitting() 
    { 
     { 
      await Task.WhenAll(ParallelEnumerable.Range(0, HitsCount) 
               .Select(_ => HitAsync()) 
               .WithDegreeOfParallelism(HitsCount)); 
     } 
    } 

    static async Task HitAsync() 
    { 
     // some logging skipped here 
     ... 
     await new HttpClient().GetAsync(TargetUrl, HttpCompletionOption.ResponseHeadersRead); 
    } 

期望
記錄顯示,所有HitAsync()調用同時進行:分別命中通過HttpClients曾在
[0開始; 0.1s]的時間框架(時間大致在這裏和下面四捨五入)。因此,我期望在Web服務端大致相同的時間內捕獲所有這些請求。

現實
但登錄在服務端示出了在束分組請求8-12請求中的每個和服務捕獲這些束與約1秒的時間間隔。我的意思是:

[0s, 0.3s] <- requests #0-#10 
[1.2s, 1.6s] <- requests #10-#20 
... 
[4.1s, 4.5s] <- request #30-#40 

而且對於任何重要的HitCount值,我的執行時間非常長。

問題
我懷疑某種內置的服務限制的機制或框架內置的併發連接的限制。只有我發現與這種猜測相關的是that,但是我沒有得到任何成功嘗試從那裏soulutions。
任何想法是什麼問題?

謝謝。

+0

構建負載在學習如何工作時,測試工具是一個很好的實踐,但是使用現有工具來完成這樣的工作幾乎總是更有成效。查看[SoapUI](http://www.soapui.org/)作爲示例那麼) –

回答

1

默認情況下,ASP.NET上的HTTP請求限制爲核心數量的12倍。我建議將ServicePointManager.DefaultConnectionLimit設置爲int.MaxValue

+0

Hello Stephen,謝謝你的回覆 我試着在測試工具一側和Web服務端都改變'ServicePointManager.DefaultConnectionLimit'的值,而且我可以在調試中看到'ServicePointManager.DefaultConnectionLimit'確實發生了變化但服務仍然只能捕獲〜10個併發請求。 – buhtopuhta

+0

只要你在第一次請求之前設置它,你就不應該被限制在你的客戶端。你對服務器端有任何限制嗎? –

+0

我在服務器端設置了與客戶端相同的限制。正如我可以看到結果是相同的限制像[這裏](http://msdn.microsoft。com/ru-ru/library/ms998549#scalenetchapt06_topic5)以及像'DefaultConnectionLimit = 1'這樣的限制。在'machine.config'中設置'processModel.maxIoThreads'也沒有任何結果。 ** [UPD] **我錯了。在服務器端的運行時(不是在配置中)設置'DefaultConnectionLimit = 1'會改變行爲:我得到一堆10個請求,其餘1個預先 – buhtopuhta

0

那麼,問題的根源在於操縱極限(約這樣的限制here一些信息的IIS + Windows 7的併發請求。搬家服務出機與Windows Server踢出了問題。