2012-08-03 102 views
4

我嘗試在我的MVC3應用程序中實現長輪詢。Asp.net MVC3長時間輪詢會話

長輪詢使用以下代碼正常工作:我可以在線程休眠時重新加載無問題的頁面。

[AsyncTimeout(30 * 1002)] 
public void TestAsync() 
{ 
    AsyncManager.OutstandingOperations.Increment(); 

    var queued = ThreadPool.QueueUserWorkItem(new WaitCallback(parm => 
    { 
    var wait = new AutoResetEvent(false); 
    wait.WaitOne(TimeSpan.FromSeconds(30)); 

    AsyncManager.OutstandingOperations.Decrement(); 
    })); 
} 
//-------------------------------------------------------------------------------- 

public ActionResult TestCompleted() 
{ 
    return Json(null); 
} 
//-------------------------------------------------------------------------------- 

但是,如果我的應用程序一樣使用會話..

this.Session["XXX"] = "Test"; 

線程運行時,我不能重新加載頁面。頁面等待單元線程就緒,然後頁面將刷新。

我該如何解決這個問題?

+1

如果你這樣做是因爲你想了解長輪詢..真棒..如果不使用.. .. SignalR這是在沒有必要的區域在現有良好支持解決方案的情況下重新發明輪子。哦,如果你正在學習長輪詢,你應該花一些時間在SignalR源代碼中。 – 2012-08-03 17:58:29

回答

1

這不是您的問題的解決方案,但它可能有所幫助。

在MVC中,您無法同時爲單個用戶會話執行多個請求。獲得真正異步請求的唯一方法是使控制器成爲SessionLess控制器,但當然,您無法讀取或寫入會話。

我想要做異步AJAX請求時遇到此問題。我想通過將SessionStateBehaviour設置爲ReadOnly我至少可以只讀訪問會話,因爲沒有併發問題,但這也不起作用。

這篇文章有詳細信息http://weblogs.asp.net/imranbaloch/archive/2011/05/10/asynccontroller-v-s-sessionless-controller.aspx