你能在两个 .net 2.0+ 应用程序之间共享会话变量吗?

3

我听说这个方法是有效的,但是...

我想我可能没有理解透彻,似乎有一个隐藏的步骤我可能错过了,有人可以纠正或指出我的错误吗?谢谢。

我有一个空白的解决方案:
- 内部包含两个 .net 2.0 web 应用程序
1) webapp1
2) webapp2

我希望它们共享相同的会话数据。

我的页面设置:

应用程序1:

Session("value") = "this is the value"

应用场景2:

If Not (Session("value") Is Nothing) Then
    value = Session("value").ToString()
End If

我的思路:

1)进入服务,开启ASP.NET状态服务
2)在两个项目中打开Web配置文件:设置

< machineKey 
validationKey="BFE2909A81903BB303D738555FEBC0C63EB39636F6FEFBF8005936CBF5FEB88CE327BDBD56AD70749F502FF9D5DECF575C13FA2D17CA8870ED21AD935635D4CC" 
decryptionKey="2A86BF77049EBA3A2FA786325592D640D5ACD17AF8FFAC04" validation="SHA1" />
< sessionState mode="StateServer" stateConnectionString="tcpip=localhost:42424" 
cookieless="false" timeout="20"/>

在两个网站中都要进行以下操作:
3)编译和测试网站
4)变得失望,因为它不起作用。我从第二个 Web 应用程序中看不到会话。

4个回答

5

如果没有一些自定义代码,您无法在不同的ASP.NET应用程序之间共享会话。在web.config中所做的是使用一个超出进程的会话,这意味着数据将不再驻留在内存中,而是驻留在专用计算机的内存中。这对于服务器集群非常有用,并且它使用ApplicationName来知道会话属于哪个应用程序。因此,如果您想要它们共享会话,基本上您的应用程序需要具有相同的名称。虽然有一些肮脏的解决方法


那个解决方法对我没有用,而且看起来其他人也没用成功...你怎么设置应用程序名称?我不能使用 SQL Server,我需要使用状态服务器或进程内。 - Greg R
根据我的个人经验,我从未需要在两个不同的ASP.NET应用程序之间共享会话状态,因此我不能保证。CodeProject上的解决方案似乎有些取巧,但在我看来应该可以工作。 - Darin Dimitrov

2
为什么你想在应用程序之间共享Sessions?ASP.NET Session并不是为此设计的。
你提出的使用相同的ASP.NET状态服务器的解决方案行不通,因为即使用户从同一台机器和同一浏览器同时使用你的两个应用程序,他们也会获得2个不同的Session标记。你需要考虑Session的工作原理才能理解这一点。
来自MSDN的内容:
ASP.NET会话状态允许您在Web应用程序中存储和检索用户的值,当用户在ASP.NET页面中导航时。HTTP是无状态协议。这意味着Web服务器将每个页面的HTTP请求视为独立请求。服务器不保留在以前请求期间使用的变量值的任何知识。ASP.NET会话状态将在有限的时间窗口内识别来自同一浏览器的请求作为一个会话,并提供一种在该会话期间持久化变量值的方式。
ASP.NET Session是用户与一个ASP.NET应用程序的当前交互的比喻。它存在于ASP.NET中,为我们提供了一个存储临时状态数据的地方,在用户使用你的应用程序时可以在各种页面请求之间进行存储。
如果您的应用程序非常密切相关,例如用户同时或几乎同时使用两者,可以考虑将它们合并为一个ASP.NET应用程序。您可以将它们部署到不同的虚拟目录中以保持某种逻辑分离度,但在IIS中只使用一个应用程序。
如果您的应用程序不是那么密切相关,您可以考虑共享同一个数据库来交换数据,或者使用基于Web服务的API来交换信息。

10
这不是一个答案。“为什么你想这样做” == “我不知道如何做到这一点”。一些人可能因为其他原因(例如公司决策等)而无法合并其网站。如果有办法可以实现这个目标,那么应该探索这种可能性,而不是简单地忽略它。 - mikeschuld
@mikeschuld 会话隐喻适用于用户与单个ASP.NET应用程序的当前交互,并且在该用例之外不合适。一旦您超出会话隐喻,您将发现有大量其他共享数据的方法,更好的解决方案是探索其他选项。我暗示合并应用程序、共享同一数据库或在应用程序之间进行接口操作,因为我相信这是比黑客会话来执行其未设计的任务更好的解决方案。 - saille

1

如果它们在同一个应用程序池中并且会话模式设置为inproc,则它们将共享会话数据。 stateserver和sqlstate的工作方式是使用您的Web地址的根作为逻辑边界。

例如,如果它们都托管在相同的地址和端口(或iis中的“站点”)上,但位于不同的子文件夹中,则它们应该共享会话。


1
那样做是可行的,因为这些项目将被编译为一个项目,但是我们不想要那样,我们想要分别编译这两个项目,然后将它们部署在一起 - 不同的虚拟目录。 - Greg R
我尝试了相同的方法,但这种方式仍然不起作用。 - Kaushik Thanki

1
此外,两个应用程序必须在同一域上运行,以便用户浏览器使用一个 cookie 来存储会话 ID。

我尝试了相同的方法,但这种方式仍然不起作用。 - Kaushik Thanki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接