会话状态跨子域共享会话,VB.NET 网站 C# MVC 4 应用程序
本文关键字:网站 NET MVC 应用程序 VB 共享 会话 会话状态 | 更新日期: 2023-09-27 18:36:36
我正在尝试从主 VB.Net 网站和子域 C# MVC 4 共享会话。
我为两个站点提供了相同的 ASP.NET_SessionId Cookie,在即时调试器中,我可以看到两个会话对象具有相同的会话 ID。但是,当我从 VB.Net 网站设置会话时,Session("TestSession") = "SimpleString"
,如果我从MVC应用程序在即时窗口中调用会话对象,则计数为0。
如果我在 MVC 应用程序中设置会话,也是如此,它在 VB.Net 网站上找不到。
最好我想使用状态服务器模式,但我读到只有 SQLServer 模式适用于跨域支持。
这是两个站点中都存在的 web.config
<httpCookies domain=".example.localhost"/>
<sessionState mode="SQLServer" sqlConnectionString="Data Source=(local);Integrated Security=True" />
<machineKey validationKey="XXX" decryptionKey="XXX" validation="SHA1" compatibilityMode="Framework20SP1" />
为了解决这个问题以及添加web.config设置,我不得不从global.asax向Application_Start添加几行。这必须添加到两个站点。
C#
FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.Static | BindingFlags.NonPublic);
HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null);
FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId", BindingFlags.Instance | BindingFlags.NonPublic);
appNameInfo.SetValue(theRuntime, "MyApplicationName");
VB.Net
Dim runtimeInfo As System.Reflection.FieldInfo = GetType(HttpRuntime).GetField("_theRuntime", System.Reflection.BindingFlags.[Static] Or System.Reflection.BindingFlags.NonPublic)
Dim theRuntime As HttpRuntime = DirectCast(runtimeInfo.GetValue(Nothing), HttpRuntime)
Dim appNameInfo As System.Reflection.FieldInfo = GetType(HttpRuntime).GetField("_appDomainAppId", System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic)
appNameInfo.SetValue(theRuntime, "MyApplicationName")
您应该使用 cookie 而不是会话变量。会话变量保存在服务器上,因此当您转到另一台服务器时,它将没有您的会话变量。
有关更多详细信息,请参阅此 SO 问题:会话变量保存在哪里