2010-07-19 57 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作为后备。两全其美,恕我直言。