OnSessionStart / Session_Start 事件是否仍然仅在服务器场环境中触发一次(总共),或者由于请求由多个服务器处理,它是否可以在每个服务器上触发一次?
ASP.NET / IIS6 或 7
不应假定服务器正在使用粘性会话。
OnSessionStart / Session_Start 事件是否仍然仅在服务器场环境中触发一次(总共),或者由于请求由多个服务器处理,它是否可以在每个服务器上触发一次?
ASP.NET / IIS6 或 7
不应假定服务器正在使用粘性会话。
对于 IIS 的默认安装,答案是“否”—— Session_Start 通常会触发多次。客户端将在它命中的每个不同服务器上创建一个新会话。如果您在 IIS 中使用 Web Garden 选项,也会出现同样的情况。
如果你不依赖 Session 并且你有一个服务器场,你通常最好完全禁用 Session 状态。这是您的操作方法:http: //support.microsoft.com/kb/306996
如果您确实依赖 Session,那么您最好的选择可能是 ASP.NET State Server Service。您场中的所有服务器都将使用单个服务器作为 Session 状态,这将确保 Session_Start 只触发一次。有关设置的大量背景和详细信息,请阅读以下内容(查找“状态服务器模式”以获取具体说明): http ://aspdotnetdevs.blogspot.com/2008/12/aspnet-session-state-and-modes.html
除了 Thomas:这取决于您的会话状态设置。
在 web.config 中,<sessionState mode="" >
如果您使用mode="InProc"
,您将获得多个 Session 和 SessionStart 事件,每个访问的服务器 1 个。
在其他模式(StateServer 或 SqlServer)中,您将获得 1 个会话和 1 个 SessionStart。您根本不会收到 SessionEnd 事件。
在场中,您将使用 Sql Server 或状态服务器来管理场中所有服务器的会话状态。它让这台服务器负责您的状态,而不是确保每个会话只应调用一次 OnSessionStart,并且无需总是让所有请求返回到同一台服务器。
使用单个服务器来维护会话状态的主要缺点是您不再有 OnSessionEnd 事件。
我的理解是,一旦请求到达场中的服务器,同一客户端的所有即将到来的请求都应重定向到场中的同一服务器。