2011-02-24 70 views
3

我已經搜索這個解決方案的高和低。任何見解將不勝感激。PageMethods和Session

情況:當在一個頁面中存在多個PageMethod調用時,每個方法調用都會阻塞Session對象的鎖。該PageMethod的調用可以異步僅取得與@Page指令轉向False|ReadOnly

發現:當Page指令是默認(讀/寫),但會議沒有顯示在頁面上的任何地方使用時,呼叫不被阻塞。任何讀取或寫入頁面級別的會話都會阻止pagemethod調用。

問題:在@Page指令中製作EnableSessionState=ReadOnly限制性很強,不想採用該路線。

pagemethod調用不能阻止嗎?並仍然訪問會話? (可能不是寫但只是讀)

+1

那麼,爲什麼使用PageMethods詳細?爲什麼不創建WCF服務來滿足您的需求? – 2011-02-24 20:39:04

+0

我的猜測是會話不是線程安全的,所以PageMethods會因爲它們不在正常的請求/響應週期而被阻止 - 許多PageMethods可以在用戶正在查看的頁面的同一時間被調用。是否有必要頻繁地調用你的PageMethods?你能改變設計嗎? http://programminglife.wordpress.com/2009/05/18/how-to-do-parallel-work-with-pagemethods/似乎通過實施異步模式提供解決方法。頁面底部的評論甚至表示,如果從Global.asax中刪除Session_Start/Session_End處理程序,會話將不會被鎖定。 – WiseGuyEh 2011-02-25 00:10:59

+0

@WiseGuyEh:上面的鏈接確保PageMethod調用是真正並行的,並且Session可用於頁面(所以不能將@Page EnableSessionState設置爲ReadOnly) - 但BeginInvoke創建一個新線程,而該線程不是會話因爲它不是頁面循環的一部分。 – 2011-02-25 18:40:24

回答

2

我不相信你可以做到這一點,而不需要實現自己的會話提供程序。有some info on this MSDN page

ASP.NET應用程序固有地是 多線程。由於 並行到達的請求在線程 並行線程 上處理,因此可能會同時執行鍼對同一個會話 的兩個或更多個 請求。 (該 典型的例子是,當一個頁面 包含兩個幀,每個靶向 不同ASPX在同一 應用,導致瀏覽器 提交用於 兩頁重疊的請求。)爲了避免數據衝突 和不穩定的行爲,提供商 「鎖定」會話時開始 處理第一個請求,導致 針對同一個 會話的其他請求等待鎖定來 免費。

因爲有一個在允許 併發請求執行 重疊讀取,鎖 通常實現爲 讀/寫鎖,也就是說,一個 允許任何數量的線程讀取 會議沒有壞處,但這可以防止重疊寫入和重複寫入以及 重複寫入。

+0

是的,ASP.NET會話提供程序無法實現此功能。當使用PageMethods時,ASP.NET會話被鎖定(PageMethods沒有ReadOnly選項)。我將WebMethods改爲HttpHandler,並在客戶端使用JQuery。我總結了我在http://stackoverflow.com/questions/5118236/sessions-in-asynchronous-design中使用的解決方案 – 2011-03-07 14:17:37