如何在 ASP.NET 中跨多个 Web 应用程序维护相同的会话 ID
Posted
技术标签:
【中文标题】如何在 ASP.NET 中跨多个 Web 应用程序维护相同的会话 ID【英文标题】:How to maintain the same session id across multiple web applications in ASP.NET 【发布时间】:2011-03-14 01:04:27 【问题描述】:我在 IIS 上的不同虚拟目录上设置了两个相同的应用程序(我已经做了一些解决方法以确保它们都具有相同的应用程序名称)。有没有办法在两个 asp.net Web 应用程序之间共享会话 ID?
由于我将会话存储在 StateServer 中,因此它们都应该获取相同的会话数据,但是,每次我从应用程序 a 转到应用程序 b 时,都会创建不同的会话 ID。这不会在负载平衡场景中发生吗?当我去 www.test.com 时,它会将该请求重定向到服务器 a,然后如果我再次点击它,它将转到服务器 b,但由于它是一个不同的 Web 应用程序,它会创建一个新的会话 ID ?
【问题讨论】:
只需将其放入数据库即可。您正在向后弯腰以适应会话的限制。 除非我应用解决方法,否则数据库会出现同样的问题。由于它是数据库中的两个不同应用程序,因此它将有 2 个单独的会话。 你误解了我的建议。 根本不要使用会话,而是将所需的任何持久数据放在一个公共数据库中。会话和 cookie 旨在防止应用程序相互踩踏,这需要隔离。这是数据库的诸多优点之一。 【参考方案1】:首先,将 web.config 中的 sessionState 元素配置为在两个应用中使用 cookieName="SOME_COOKIE_NAME_HERE"。
然后,只需确保 url 具有相同的 TLD(***域),即 app1.mydomain.com 和 app2.mydomain.com,您应该能够处理 Global.asax 中的 Session_Start 事件并将其放入代码:
HttpCookie cookie = new HttpCookie("SOME_COOKIE_NAME_HERE", Session.SessionID.ToString());
cookie.Expires = DateTime.Now.AddMinutes(20);
cookie.Domain = "*.mydomain.com";
cookie.HttpOnly = true;
Response.SetCookie(cookie);
另外,我建议您使用 SqlServer SessionState 模式。
【讨论】:
有趣。应用此更改后,我会为每个请求获得一个新的会话 ID。这是我的 Global.asax 代码: void Session_Start(object sender, EventArgs e) HttpCookie cookie = new HttpCookie("SessionCookie", Session.SessionID.ToString()); cookie.Expires = DateTime.Now.AddMinutes(20); cookie.Domain = "*.keivantest.com"; cookie.HttpOnly = true; Response.SetCookie(cookie);这是我的 web.config 配置:最初我遇到了同样的问题。我所做的是,我覆盖了每个域的 jsession id。我的意思是,如果用户登陆 domain1.com,请从 iframe 为 domain2.com 设置相同的会话 ID。反之亦然。这样,您就可以跨多个域保持相同的会话。
您需要使用负载平衡器通过网络测试对多台服务器的影响。
【讨论】:
【参考方案3】:您的目标是在 2 个应用程序之间共享会话状态,而不仅仅是会话 ID?我相信 StateServer 还使用应用程序路径以及 SessionID 来存储数据,因此即使 SessionID 相同,您仍然无法共享数据。您可能必须编写自己的会话模块。
负载平衡网络应用程序没有这个问题,因为应用程序路径在集群成员之间是相同的。
【讨论】:
你是对的。我正在使用 httpmodule 将两个应用程序的相同应用程序名称设置为相同的值。 他说他很麻烦地让应用程序名称相同以上是关于如何在 ASP.NET 中跨多个 Web 应用程序维护相同的会话 ID的主要内容,如果未能解决你的问题,请参考以下文章
我应该如何将多个参数传递给 ASP.Net Web API GET?
如何使用 JavaScript/jQuery 从 ASP.NET Web 窗体的 GridView 内部同时上传多个文件?
如何让 viewForZoomingInScrollView 在 Xcode 中跨多个 UIViewControllers 工作?