据我了解,当其 w3wp 所有者进程回收时,所有 InProc 会话数据总是消失,因为它仅驻留在 w3wp 内存中。

我想知道当回收发生在进程外部的某个地方时是否可以缓存会话数据,然后在会话恢复时重新注入(并重建)会话。这样我就可以在必要时获得 InProc 的速度和类似状态服务器的外部化的可靠性。这可能吗?

有帮助吗?

解决方案

没有,这是不可能的。有没有API过程中的会话状态或高速缓存“热身”。这样的解决方案是不可靠的反正。你不能gaurantee您的应用程序所做的最后一件事是出口其当前会话状态,所以你永远无法在导入的数据统计是最新的反正。

您可以使用外的进程内的状态服务器在同一台主机作为Web应用程序上。然后,Web应用程序可以自由循环,保持状态信息完整。这比使用SQL Server来管理会话,因为你不必处理SQL或网络传输的开销到另一台机器快了不少,唯一的办法是比进程更糟糕的会话状态是,数据必须跨进程边界的名帅,但只要你没有的快速变化的会话数据的巨量,这不应该是明显的。

还有其他的替代品,如微软项目代号为“速度” ScaleOut软件的SessionServer (其中包括我敢肯定)可以保持在服务器群中的服务器之间的同步会话状态或高速缓存,而不必那个提议分布式缓存机制求助于使用SQL Server中。

相反的是其他用户发布的,我不会使用ViewState中存储会话数据,如果在所有可能的。首先,它是不正确的会话状态,如果用户移动向后或向前它可能会丢失。其次,它是相当不安全的。第三,它使得如果滥用大量页膨胀。

其他提示

也许可以存储在cookie中足够的信息(或在ViewState中)的基础上在辅助进程被回收的情况下的数据,以便可以重新创建的会话。

或者你可以创建自己的状态服务器(例如Windows服务),您存储您的会话的一部分,并通过远程或类似的从Web应用程序访问此服务。

如果您愿意的话,您应该使用 SQL Server 来获取会话状态。您想要的是可以从主机进程完全结束中恢复的会话。inproc 或 stateserver 都不支持这一点,因为一旦它们宕机,它们就会丢失所有数据。您可以编写自己的状态方法,但这会很费力。如果您想这样做,请遵循以下说明:

http://www.exforsys.com/tutorials/asp.net-2.0/asp.net-2.0-customizing-the-session-state-mechanism.html

您可能想要做的就是根本不使用会话,而是更多地依赖 ViewState。如果您的网站流量较高,那么这是将工作负载转移给客户的好方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top