2016-06-21 233 views
0

我想確定當我的Web API方法被兩個客戶端同時調用時會發生什麼。爲了做到這一點,我在Python中生成兩個異步請求:ASP.NET Web API 2處理異步請求

rs = (grequests.post(url, data = json), grequests.post(url, data = json)) 
grequests.map(rs) 

的請求調用我的WebAPI非異步方法正在改變我的資源,這是一個靜態類的實例。從我的理解,API請求不應該同時運行,這是我想要的,因爲我不希望這兩個請求干擾彼此。但是,如果我在API方法中設置了一個斷點,那麼這兩個請求似乎併發(並行)。這會導致一些不想要的結果,因爲這兩個請求正在並行地更改相同的資源。

有什麼方法可以確保Web API非併發地處理請求嗎?

+1

鎖定您的共享資源。 –

+0

@BrianDriscoll請參閱我的編輯。我已經確定資源被鎖定在一個隊列中,但是,我仍然在請求之間發生干擾。 –

+3

Web API請求是否同時運行取決於您的API託管方式,因此不會在代碼中確定。如果您在IIS中運行,則您的請求將由單獨的工作進程併發處理。不知道更多關於API的信息,我會認爲你有設計問題而不是實現問題。 –

回答

3

對您的Web API方法的請求由IIS應用程序池(線程池)處理,它爲接收到的每個同步請求初始化一個線程。沒有辦法告訴IIS以非併發方式運行這些線程。

我相信你對「非異步」Web API方法有什麼誤解。當Web API方法是異步的,這意味着它將在處於等待狀態時共享其應用程序池線程。這具有其他請求不需要初始化新線程的優點(這有點貴)。它還有助於最大限度地減少併發線程的數量,從而最大限度地減少應用程序池必須排隊的線程數。

對於非異步方法,即使非活動線程可用,IIS應用程序池也會爲每個請求初始化一個新線程。此外,它不會與其他任何請求共享該線程。

所以你的問題的簡短答案是否定的。沒有辦法確保Web API請求不是同時處理的。 Brian Driscoll的評論是正確的。你將不得不在請求期間鎖定你的共享資源。