【发布时间】:2025-12-15 07:15:02
【问题描述】:
我无法让 2 个相同的 ASP.NET MVC 应用程序使用 Session StateServer 共享同一个 Session。我尝试这样做的原因是我们最终将在需要共享相同状态的 3 个 Web 服务器上部署这个应用程序。我们需要使用 StateServer,因为我们试图尽量减少对非数据相关存储的 db 的使用。
设置:
我已将相同的代码库部署到 http://localhost/App1 和 http://localhost/App2
两者都有相同的 Web.Config 文件,内容如下:
<system.web>
<sessionState mode="StateServer"
cookieless="false"
timeout="20"
stateConnectionString="tcpip=127.0.0.1:42424" />
//stateConnectionString="tcpip=192.168.1.52:42424" /> // also doesn't work
<machineKey
validationKey="8B9F68D0CC730F6F046D0173021C34B1A0D9A01C21D8E4D4A7A1DFF38332DEE8CBBAFEA503C18776614EE9D4F7EEA7E5D2D5571630547D822485A27B1EF53AC1"
decryptionKey="60009563EFCFC594FD1BC46684943AA398EE70412A624B2EB488BBB071F15ECF"
validation="SHA1" decryption="AES" />
我用this tool to generate these machine keys
测试:
我将以下内容放入我的一个控制器中以测试它是否正常工作:
ViewData["mode"] = requestContext.HttpContext.Session.Mode.ToString();
string timestamp = DateTime.Now.ToString();
if (requestContext.HttpContext.Session["timestamp"] == null)
{
requestContext.HttpContext.Session["timestamp"] = timestamp;
}
ViewData["timestamp"] = requestContext.HttpContext.Session["timestamp"].ToString();
ViewData["realtime"] = timestamp;
在视图中显示:
<p>
Mode: <%= ViewData["mode"].ToString() %>
</p>
<p>
Time: <%= ViewData["timestamp"].ToString() %>
</p>
<p>
real time: <%= ViewData["realtime"].ToString() %>
</p>
结果:
对于这两种部署,当页面首次加载时,我可以看到模式为 StateServer,并且时间戳设置为与实时值相同的时间。但是,如果这有效,则只有第一页应该有与实时值相同的时间。第二个页面加载应该从 StateServer 读取,因为该时间戳值不再为空,并显示该时间值。但相反,它再次显示实时值。
当我刷新页面时,时间戳保持不变,实时值始终在更新。这表明时间戳正在保存到 Session,但两个部署的时间戳值在应该相同时总是不同,因此这表明 Session 没有被共享。
有人可以指出我做错了什么,或者我需要做些什么才能让它工作吗?谢谢
【问题讨论】:
-
你能完成这个吗?
-
@DaveDev 我知道我迟到了:P,但这可以帮助其他人。如果您可以找到共享相同域的会话 cookie(请参阅msdn.microsoft.com/en-IN/library/ms228262(v=vs.85).aspx)并将会话存储在公共服务(DB/Redis)中,那么您绝对可以在多个服务器之间共享会话
标签: c# asp.net asp.net-mvc session stateserver