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

时间:2009-03-08 13:12:38

标签: asp.net session

我被告知这是有效的,但是......

我想我只是没有得到这个,似乎有一个隐藏的步骤我可能会失踪,任何人都可以纠正这个或指出我的错误?感谢。

我有一个空白的解决方案:
- 里面是两个.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)变得失望,因为它不起作用。我从未在第二个webapp上看到会话。

4 个答案:

答案 0 :(得分:5)

如果没有自定义代码,则无法在不同的ASP.NET应用程序之间共享会话。您在web.config中所做的是使用进程外会话,这意味着数据将不再驻留在内存中,而是驻留在专用计算机的内存中。这对服务器场很有用,它使用ApplicationName来了解会话所属的应用程序。因此,如果您希望它们共享会话,那么基本上您的应用程序需要具有相同的名称。虽然有一些肮脏的workarounds

答案 1 :(得分:1)

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

例如,如果它们都托管在相同的地址和端口(或iis中的“站点”)但是在不同的sibfolders中,那么它们应该共享我认为的会话。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

为什么要在应用程序之间共享会话? ASP.NET Session不是为此而设计的。

您提议的使用相同ASP.NET状态服务器的解决方案不起作用,因为您的用户只需获得2个不同的会话令牌,即使他们同时使用同一台计算机上的2个应用程序和相同的浏览器。您需要考虑Session的工作原理,以了解其原因。

来自MSDN

  

ASP.NET会话状态使您可以存储和检索a的值   用户作为用户在Web应用程序中导航ASP.NET页面。 HTTP是   无国籍协议。这意味着Web服务器会处理每个HTTP   请求页面作为独立请求。服务器保留没有   了解在先前请求期间使用的变量值。   ASP.NET会话状态在此期间识别来自同一浏览器的请求   作为会话的有限时间窗口,并提供一种持久的方式   该会话期间的变量值。

ASP.NET Session是用户当前与一个ASP.NET应用程序交互的隐喻。它存在于ASP.NET中,使我们可以在用户使用您的应用程序时在各种页面请求之间存储临时状态数据。

如果您的申请非常密切相关,例如用户可以同时或几乎同时使用它们,您可以考虑将它们合并到单个ASP.NET应用程序中。您可以将它们部署到不同的虚拟目录中以保持某种程度的逻辑分离,但在IIS中只使用一个应用程序。

如果您的应用程序不是那么紧密相关,那么它们应该共享相同的数据库作为交换数据的方式,或者使用API​​,例如基于Web Services交换信息。