2014-02-14 26 views
2

我有以下控制器:如何使控制器行動真正異步

public class PingController : ApiController 
{ 
    [Route("api/ping")] 
    [HttpGet] 
    public IHttpActionResult Ping() 
    { 
     var log = HostLogger.Get(typeof(PingController)); 
     log.Info("Ping called."); 
     return Ok("Ping succeeded @ " + DateTime.UtcNow); 
    } 

    [Route("api/long-ping")] 
    [HttpGet] 
    public async Task<IHttpActionResult> LongPing(CancellationToken cancelToken) 
    { 
     await Task.Delay(30 * 1000); 
     return Ok("Ping succeeded @ " + DateTime.UtcNow); 
    } 
} 

如果我執行平村,其次是中國平安在不同的瀏覽器標籤,平安將執行並返回平村做之前 - 這正是我在找什麼。問題是當我執行兩個LongPing電話時,第二個需要大約60秒才能完成(而不是30秒)。 Chrome報告第二個電話的延遲時間爲58秒(60秒減去啓動第二次請求所花費的時間)。在我看來,如果我的這個工作正常,那麼這兩個LongPing調用應該在大約30s內執行。

我還要提到的是,我在OWIN的託管環境,而不是IIS託管這一點。但我認爲這沒有什麼區別,但也許有人會證明我錯了。

如何使龍平的行爲真正喜歡一個異步請求?

+1

禁用會話狀態 – SLaks

+0

如果這是使用標準的MVC在IIS託管,我可能會同意。但這是一個控制檯託管OWIN應用程序使用WebAPI默認情況下沒有會話(我認爲這是正確的)。 –

回答

1

這很可能是你的會話狀態是造成你的問題。對此行爲有一個長期的解釋,但簡短的版本是,一個特定的用戶會話一次只能執行一個請求,因爲會話狀態被鎖定以確保一致的狀態。如果您想加快速度,請禁用Cookie以測試會話狀態假設(您將以這種方式獲得每個請求1個會話狀態),或禁用應用程序中的會話狀態。否則你的代碼是異步明智的。