簡體   English   中英

為什么我對web.api的請求被長時間運行的控制器代碼阻止了?

[英]Why are my requests to web.api being blocked by long running controller code?

我正在使用angular向Web.API(托管IIS 8.5)發出Ajax調用的本地開發環境。 我正在通過不同的角度控制器同時撥打5個電話,每個電話看起來都像這樣:

$scope.medications = API.Client.MedicationProfiles.query({ clientId: clientId });

API服務對Client.MedicationProfiles資源具有以下定義:

this.Client.MedicationProfiles = $resource(
    '/Noteable.API/api/Client/:clientId/MedicationProfiles/:id',
    {
        clientId: '@clientId',
        id: '@Id'
    },
    {
        update: { method: 'PUT' }
    }
);

當頁面加載時,我基本上可以看到所有使用chrome dev工具一次發送到服務器的請求,但是看起來它們一次又一次返回,就好像它們是同步運行的一樣。 我在Web.API控制器操作之一中放入了一個thread.sleep,很確定,在那之后發出的所有調用都無法返回,直到正在休眠的調用才返回。 這對我來說沒有任何意義,我想知道是否有人可以告訴我在什么情況下會發生這種情況。

這可能是在Web api后端上實現異步模式的一個好情況-一旦ajax調用碰到了控制器,就可以避免阻塞。 這可以通過利用asyncawait模式來實現。 您將要返回一個Task ,它代表一個異步操作。

一個例子可能包括...

public async Task<IHttpActionResult> Put(string clientId)
{
    var response = await this.yourService.yourSavingMethod(clientId);

    return Ok(response);
}

另請參閱SO問題為什么此Web api控制器為什么不並發? 有關此問題的更多詳細信息和見解。 此外,ASP.NET會話狀態的默認行為可以更改以適應並發請求。 一個例子可能包括

HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.ReadOnly)

ASP.NET會話狀態概述

我認為您的問題是由瀏覽器或ASP.NET引起的。 如果是ASP.NET,請看以下線程:

C#Web API-阻止

如果是您的瀏覽器,請使用示例代碼查看此線程:

為什么我的異步ASP.NET Web API控制器阻塞了主線程?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM