我知道所有 InProc 会话数据在其 w3wp 所有者进程回收时总是消失,因为它只驻留在 w3wp 内存中。
我想知道是否可以在进程外部的某个地方发生回收时缓存会话数据,然后在会话恢复时重新注入(并重建)会话。这样我就可以在必要时获得 InProc 的速度以及类似状态服务器的外部化的可靠性。这可能吗?
我知道所有 InProc 会话数据在其 w3wp 所有者进程回收时总是消失,因为它只驻留在 w3wp 内存中。
我想知道是否可以在进程外部的某个地方发生回收时缓存会话数据,然后在会话恢复时重新注入(并重建)会话。这样我就可以在必要时获得 InProc 的速度以及类似状态服务器的外部化的可靠性。这可能吗?
不,这是不可能的。没有用于“预热”进程内会话状态或缓存的 API。这样的解决方案无论如何都是不可靠的。你不能保证你的应用做的最后一件事就是导出它当前的会话状态,所以你永远不能指望导入的数据是最新的。
您可以在与您的 Web 应用程序相同的主机上使用进程外状态服务器。然后 Web 应用程序可以自由回收,保持状态信息不变。这比使用 SQL Server 管理会话要快得多,因为您不必处理 SQL 的开销或网络传输到另一台机器,它比进程内会话状态更糟糕的唯一方法是数据必须跨进程边界编组,但只要您没有大量快速变化的会话数据,这根本不应该引起注意。
还有其他替代方案,例如名为“Velocity”的 Microsoft Project Code或ScaleOut Software 的 SessionServer(我敢肯定),它们提供分布式缓存机制,可以在服务器场中的服务器之间保持会话状态或缓存同步,而无需求助使用 SQL Server。
与其他用户发布的内容相反,如果可能的话,我不会使用 ViewState 来存储会话数据。一方面,它不是真正的会话状态,如果用户向后或向前移动,它可能会丢失。其次,它相当不安全。第三,如果被滥用,它会导致大量页面膨胀。
也许您可以在 cookie(或 ViewState)中存储足够的信息,以便在工作进程被回收的情况下,您可以根据该数据重新创建会话。
或者,您可以创建自己的状态服务器(例如 Windows 服务),在其中存储部分会话,并通过远程处理或类似方式从 Web 应用程序访问此服务。
如果这是您的意图,您应该将 SQL Server 用于会话状态。您想要的是可以从主机进程的完全结束中恢复的会话。inproc 或 stateserver 都不支持,因为一旦它们关闭,它们就会丢失所有数据。你可以编写自己的状态方法,但这会很费力。如果您想这样做,请参考以下说明:
您可能想要做的根本不是使用会话,而是更多地依赖 ViewState。如果您有一个高流量站点,这是将工作负载推给客户的好方法。