2012-10-08 37 views
3

我正在玩ApiController中的異步方法,這種行爲令我感到驚訝。與以下網址MVC 4 ApiController和異步併發

// GET api/values/{id} 
public async Task<object> Get(int id) 
{ 
    var received = DateTime.Now; 
    await Task.Delay(10000); 
    var finished = DateTime.Now; 
    return new { id, received, finished }; 
} 

從四個瀏覽器窗口中的順序,每個約一秒鐘後:我調用下面的方法

http://localhost:55571/api/values/1 
http://localhost:55571/api/values/2 
http://localhost:55571/api/values/3 
http://localhost:55571/api/values/2 

第一個URL回來,如預期,十在我啓動它之後幾秒鐘,緊接着是第二個和第三個URL。但是,與第二個URL相同的第四個URL在第二個URL返回後返回十秒鐘。

這暗示了瀏覽器和我的代碼之間的東西是將請求串行化到相同的URL或相同的參數集合,或其他東西(以及POST,PUT等?)。而不是逆向工程這,我想問...

這種行爲記錄在某處?

編輯:我試圖抓住在this straw,無濟於事。

編輯:作爲評論請求,定時如下(大約):

0 s: GET …/values/1 
1 s: GET …/values/2 
2 s: GET …/values/3 
3 s: GET …/values/2 (2nd instance) 
10 s: GOT …/values/1 
11 s: GOT …/values/2 
12 s: GOT …/values/3 
21 s: GOT …/values/2 (2nd instance) 
+0

您能告訴我們一個時間的例子嗎?包括客戶何時開始請求以及何時完成? – svick

+0

@svick:完成... –

回答

2

瀏覽器將自動地限制它們具有到主機的連接的數量。 RFC 2616(HTTP 1.1)建議限制兩個持久連接;它顯示你的瀏覽器正在使用三個限制。

+0

這是一個很好的觀察。但是,如果我只在兩個不同的瀏覽器窗口中加載一個URL,我會看到相同的行爲。 –

+0

什麼瀏覽器?例如,我希望IE能夠遵守這個限制,因爲所有的瀏覽器窗口都使用WinINet.dll,它實際上限制了它。 –

+0

我使用谷歌瀏覽器。我現在在錯誤的電腦上,但明天我會嘗試更多的組合方式。 –