2010-07-23 56 views
6

當客戶端會話建立到ASP.NET MVC2應用程序時,我無法找到明確的答案我假設線程池中的特定線程處理該請求。同一個線程是否總是處理該會話的所有後續請求?因此,理論上,如果會話ID被搞砸了,並且選擇了錯誤的線程,那麼會丟失任何會話級別的數據? 謝謝會話和線程

+0

我不確定線程​​方面會如何導致會話ID變得混亂​​。你能再解釋一下你的想法嗎? – 2010-07-29 02:58:49

回答

2

不可以。每個請求可以由不同的線程處理。這意味着頁面上的各種資源可以由不同的線程處理。或者他們可能會在同一個處理。這取決於工作流程和iis,以確定是否值得創建新線程,或者更好地等待一個線程變得可用。

該頁面將被一個線程渲染,然後可以在相同或其他線程上處理圖像,樣式表和javascripts。這對於一般的ASP.NET和Web編程中的無狀態本質至關重要。它允許你做的是在不同的服務器甚至不同的域之間平衡所有的請求。

這給我們帶來了關於會話狀態的問題。您不應該在請求之間丟失會話id。如果你是,那麼嚴重的事情是錯誤的。或者,您可能處於網上服務器場/羣集環境,其中一個請求將發送到一個服務器,另一個請求會通過某種負載平衡路由到另一個服務器。

在負載均衡的情況下,你必須有一些持久化會話狀態的方法。兩種最常見的方法是保存到數據庫和分佈式緩存。後者是我的首選方法,因爲會話數據本質上是臨時性的,不屬於持久性數據庫。

3

總之,不,不是在IIS(我不能保證在Visual Studio中的「卡西尼」 Web開發服務器,但我也懷疑有)

可以證明該線程中加入以下變化一個觀點:

<%= System.Threading.Thread.CurrentThread.ManagedThreadId %> 

現在反覆從您的瀏覽器中點擊頁面(或者打2級或3的瀏覽器),你會看到它隨着時間而改變。

話雖如此 - 在這樣一個簡單的情況下,你可能會經常看到相同的線程爲請求提供服務,因爲它不值得ASP.NET創建比它需要更多的線程,但一旦你開始加載服務器,你會看到多個線程。