2010-07-19 61 views
1

我正在研究將跨多個負載平衡服務器部署的ASP.NET MVC Web應用程序。通過這種設置,用戶可能有一個請求由服務器A提供,下一個請求將由ServerB或ServerC提供服務。如何實現Windows服務來管理會話狀態?

我們不希望將會話數據存儲在數據庫中,因爲我們試圖儘可能減少數據庫命中。因此,我們需要將HttpSession管理並存儲在另一臺服務器上。

我的理解是,這是可以通過使用Windows服務管理此我,但我不熟悉如何實現這一點。有人可以給我一些關於如何做到這一點的好文檔嗎?或者考慮任何陷阱或其他要點?謝謝

回答

4

您需要專用一臺將承載Windows NT服務和必須安裝.NET的機器(以及您可以使用其中一臺Web服務器作爲狀態服務器,但恕我直言,這將是一個非常糟糕的主意):

net start aspstate 

,然後指示你的應用程序使用此服務器:

<system.web> 
    <sessionstate 
     mode="stateserver" 
     cookieless="false" 
     timeout="20" 
     server="127.0.0.1" 
     port="42424" 
    /> 
</system.web> 

其中當然,你將與託管NT服務的服務器的IP地址替換127.0.0.1

注1:不要忘記裝飾你打算存儲到會話與[Serializable]屬性的對象。

注2:這是在負載均衡的環境中很好的解決方案,但如果你正在尋找一個真正的故障轉移羣集,你應該使用SQL服務器。

您可以閱讀關於ASP.NET會話狀態on MSDN的更多詳細信息。

+0

嗨達林,謝謝你。但我有個問題。我理解使用[Serializable]裝飾對象的意義,但在我們的例子中,我們只會在會話中存儲整數和字符串(例如,我們將存儲與用戶關聯的siteId)。這些可以直接進入嗎? – DaveDev 2010-07-20 08:03:16

+0

@DaveDev,是整數和字符串是可序列化的。 – 2010-07-20 08:13:06

+0

這個工作,但不是'net start aspstate',我不得不使用'net start aspnet_state',而不是'server'&'port',我不得不使用'stateConnectionString =「tcpip = 127.0.0.1:42424」 '。儘管如此,這讓我很開心。謝謝 – DaveDev 2010-07-20 09:34:17

0

你可能要考慮另一種選擇是Memcached Providers - 它允許你存儲在memcached的實例的會話狀態;可選地使用SQL Server作爲後備。兩全其美,恕我直言。