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

In a multi web server farm, how does session state work?

案例 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 服务器

<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 中,sql 或状态服务器的适当位置必须在 web.config 中为农场中的每个 Web 服务器配置。

  1. 我们能否将一些服务器配置为状态,一些服务器配置为 sql?

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

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

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

关于你的问题,documentation说的很清楚了。

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

1.) 我们能否将一些服务器配置为状态,一些服务器配置为 sql?

不,你不应该。假设当用户发出请求时,您网络场中的其中一台服务器会将会话存储在 StateServer 中。现在,如果同一用户发出另一个请求(通过单击某些链接等...),那么如果您的负载均衡器将此请求发送到第二个 Web 服务器会发生什么情况?与您配置 SqlServer 模式相同的用户不会有会话,并且该用户的会话在第一次请求时存储在状态服务器上。

2.) 我们可以有一些 cookieless 和一些 as withcookie 吗?

再次否定,因为与上面指出的理解非常相似。其中一台服务器将使用 cookie 来跟踪会话,另一台服务器将使用无 Cookie(因此 URI)来跟踪同一会话,因此,如果请求被转发到不同的服务器,则不会检测到任何会话。

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

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

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

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

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


补充说明: Cookie 或 URI 有一个与之关联的 SessionIDSessionID 是一个唯一的字符串,用于在两次访问网站之间跟踪单个访问者。

作为 cookieless="true" 的结果,SessionID 将嵌入所有页面 URL。缺点是你最终会得到丑陋的 URLs,这对 SEO(搜索引擎优化)不是很好,访问者肯定不会记住它。这是使用 ASP.NET 无 cookie 会话的网站示例 URL:

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

粗体部分代表session id,用于识别访问者。