在多Web服务器场中,会话状态如何工作?

时间:2015-05-12 11:35:14

标签: asp.net session-state

案例1:StateServer

<system.web>
   <sessionState     mode="StateServer"     stateConnectionString="tcpip=127.0.0.1:42626"     sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"     cookieless="false"     timeout="20"   />
 ... 
</system.web>

案例2:SQL Server

<sessionState   mode="SQLServer"   stateConnectionString="tcpip=127.0.0.1:42626"   sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"   cookieless="false"   timeout="20" /> 

问题: 1.在情况1和2中,必须在web.config中为服务器场中的每个Web服务器配置sql或state服务器的适当位置。

  1. 我们可以将一些服务器配置为状态,一些服务器配置为sql吗?

  2. 我们可以有一些无cookie和一些ascookie

  3. 假设我们只使用<sessionState cookieless="true" />,那么默认情况下使用哪种模式?这可以在多服务器场中完成,还是需要指定IP?

2 个答案:

答案 0 :(得分:2)

1。)我们可以将一些服务器配置为状态,一些服务器配置为sql吗?

不,你不应该。假设用户发出请求时,Web Farm中的某个服务器会将会话存储在StateServer中。现在万一同一个用户发出另一个请求(通过点击某些链接等...),然后想象如果您的负载均衡器将此请求发送到第二个Web服务器会发生什么?与配置SqlServer模式相同的用户将没有会话,并且用户的会话在First请求上存储在状态服务器上。

2。)我们可以拥有一些无cookie和一些withcookie吗?

同样不,对于如上所述的非常相似的理解。其中一个服务器将使用cookie来跟踪会话,另一个服务器将使用Cookieless(因此URI)来跟踪同一会话,因此,如果请求被转发到不同的服务器,则将检测到NO会话。

3.。)假设我们只使用<sessionState cookieless="true" />,那么默认情况下使用哪种模式?这可以在多服务器场中完成,还是必须指定IP?

了解此设置:cookieless="true|false",仅用于 TRACK 客户端和服务器端之间特定用户的会话。

实际会话 DATA 存储在SqlServer / State Server上,在您的模式设置中定义为:

<sessionState  mode="StateServer|SqlServer" ... />

如果您未指定任何mode设置,则会使用默认值InProc

附加说明: Cookie或URI与SessionID关联。 SessionID是一个唯一字符串,用于在访问网站之间跟踪个人访问者。

由于cookieless="true"SessionID将嵌入所有网页网址中。缺点是你会得到丑陋的URL,这对于SEO(搜索引擎优化)来说并不是那么好,访问者肯定不会记住它。以下是使用ASP.NET无cookie会话的网站示例网址:

http://samplewebsite.com/(的 45f8c4zyybphaw2mt3dfgnjk4j )/ Home.aspx

粗体部分代表会话ID,用于识别访问者。

答案 1 :(得分:1)

你的问题有点模糊。如果您在多个服务器上托管一个应用程序,我建议您坚持使用一种方法。如果一个用户首先使用一个mode连接到服务器,而下一个请求由另一个请求处理,该怎么办?其他服务器无法访问/知道会话状态。

关于你的问题,documentation非常清楚。

cookieless不会影响mode。如果您未指定mode,则默认为InProc。如果cookielesstrue,则ASP将使用查询字符串。