如何在ASP.NET中的多个Web应用程序中维护相同的会话ID

时间:2010-07-09 19:03:23

标签: asp.net session-state sessionid stateserver

我在IIS上的不同虚拟目录上设置了两个相同的应用程序(我已经做了一些解决方法以确保它们都具有相同的应用程序名称)。有没有办法在两个asp.net Web应用程序之间共享会话ID?

由于我将会话存储在StateServer中,因此它们都应该获得相同的会话数据,但是,每次从应用程序a到应用程序b时,都会创建不同的会话ID。这也不会在负载平衡场景中发生吗?当我去www.test.com时,它会将该请求重定向到服务器a,然后如果我再次点击它,它将转到服务器b,但由于它是一个不同的Web应用程序,它将创建一个新的会话ID ?

3 个答案:

答案 0 :(得分:7)

首先,在web.config中配置sessionState元素,在两个应用程序中使用cookieName =“SOME_COOKIE_NAME_HERE”。

然后,只需确保网址具有相同的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模式。

答案 1 :(得分:1)

最初我遇到了同样的问题。我所做的是,我在每个领域的jsession id之上。我的意思是,如果用户登陆domain1.com,请从iframe为domain2.com设置相同的会话ID。反之亦然。有了这个,您可以跨多个域维护相同的会话。

您需要使用负载均衡器测试网络上多台服务器的影响。

答案 2 :(得分:-1)

您的目标是在两个应用程序之间共享会话状态,而不仅仅是会话ID吗?我相信StateServer也使用应用程序路径和SessionID来存储数据,因此即使SessionID相同,您仍然无法共享数据。您可能必须编写自己的会话模块。

负载平衡Web应用程序没有此问题,因为跨群集成员的应用程序路径相同。