2010-11-30 112 views
23

在我看來,ASP.net排隊使用相同會話ID的所有請求。假設你有3頁。ASP.net會話請求排隊

Default.aspx的

protected void Page_Load(object sender, EventArgs e) 
{ 
    Session["asdf"] = "LOLZ"; 
} 

達不到這個頁面,如果不存在顯然會創建一個新的會話。

X-AspNet-Version: 2.0.50727 
Set-Cookie: ASP.NET_SessionId=ibjphuv0aiafqi453tyze345; path=/; HttpOnly 

然後你打Hang.aspx

protected void Page_Load(object sender, EventArgs e) 
{ 
    Thread.Sleep(10000); 
} 

而且馬上你打任何其他頁面,該會話ID將被傳遞給,如果它沒有做任何事情沒有關係後,讓我們把它測試的.aspx。

加載順序如此。

Request   Timeline 
"GET /"   |*| 
"GET /Hang.aspx"  |******************************************| 
"GET /Test.aspx"   |**************************************| 

我想我的問題是如何禁用此功能。我知道讓會話狀態更具可預測性是很有用的,但在我的情況下,長時間運行的報告頁面負載正在阻止用戶執行多任務的能力。

+0

你怎麼測試呢? Visual Studio中的IIS或Cassini開發服務器? – Kev 2010-11-30 21:43:14

+0

Windows Server 2008,7 Professional和IIS 2010 Dev Server上的IIS。 – Novikov 2010-11-30 21:43:57

回答

19

此行爲是設計使然;不允許併發訪問會話狀態。具有相同SessionID的請求將被專門鎖定以防止其狀態的潛在損壞。

要解決這個問題,您可以在頁面指令中禁用會話狀態。

<%@ Page EnableSessionState="false" %> 

閱讀「併發請求和會話狀態」這裏http://msdn.microsoft.com/en-us/library/ms178581.aspx更多。

設置EnableSessionState="ReadOnly"將阻止該頁面獲得對SessionState的排他鎖定(但頁面本身必須等待用戶的其他非ReadOnly請求在加載前完成)。

(這是我回答的複製和粘貼到這個問題ASP.net site: Long-loading page for user puts all other page loads for user on Hold