【问题标题】:Session Management in ASP .NETASP .NET 中的会话管理
【发布时间】:2011-10-22 01:36:13
【问题描述】:

刚刚有一个关于 ASP .NET 中的会话管理的问题。我查看了 IIS 中的 3 个选项(InProc、StateServer 和 SQL Server),并且在跨多个服务器和多个 Web 应用程序部署会话持久性时遇到了问题。是否有任何其他选项可用于管理跨子域(来自同一个父域)以及每个域下的多个 Web 应用程序的会话?

我给你举个例子: 想象一个网站 www.thisismysite.com.au。当我登录时,我会访问 login.thisismysite.com.au。通过浏览该站点,我访问了 www.thisismysite.com.au/MyWebApp/。我想要实现的是让会话在所有三个链接中持续存在。我知道有一个第三方工具可以做到这一点,Groat SessionFarm,但我想知道是否还有其他工具?此外,如果这有什么不同的话,还可以混合使用 SSL/非 SSL。

注意:我不担心身份,我可以实施 Windows Identity Foundation(或类似的)并在所有三个地方发送声明。我在会话持久化之后。

非常感谢, 李

编辑: 我最终使用了我们可以为我们的目的定制的第三方代码。完美运行,在购买源代码时,我们可以根据需要对其进行更新。

【问题讨论】:

    标签: asp.net session stateserver


    【解决方案1】:

    SQL Server 中的状态服务器或存储应该可以正常工作 - 即使跨多个应用程序,但您必须记住所有应用程序必须具有相同的 MachineKey。

    ASPNET-load-balancing-and-ASPNET-state-server

    HTH

    【讨论】:

      【解决方案2】:

      听起来您可能想要的是分布式缓存?

      这篇文章可能会给你一些选择 - Distributed Cache/Session Solution for ASP.NET Web App

      我对该领域有点陌生,但我正在努力在我当前的 MVC/ASP.NET 项目中使用 Microsoft Azure 的 AppFabric 缓存来处理会话状态,因为 Azure Web 应用程序本身并没有为会话状态提供好的选项。

      我相信上面提到的帖子中的链接类似于 Azure 的 AppFabric 缓存,并且也可以处理会话状态。不过,我没有与他们中的任何一个合作过,所以不能保证可靠性。这个周末我也在自己的应用程序中开始了这方面的工作。

      格雷格

      【讨论】:

      • 我查看了 Azure 的 AppFabric,据我所知,它就像一个更大版本的 StateServer,这意味着我无法在不同的 Web 应用程序(子域或子应用程序)上共享会话。不过,它适用于多个服务器上的同一站点/应用程序。
      【解决方案3】:

      一种选择是通过 SQL Server 管理会话状态,或者您可以查看 NCache 之类的东西来跨多个服务器管理状态。

      【讨论】:

      • 是的,但这不适用于多个应用程序(子 Web 应用程序或子域)
      【解决方案4】:

      状态服务器或 SQL 服务器应该可以工作。至少对于http。 Https 请求可能需要在同一个 IP 上结束...不确定。

      您还可以使用维护会话的硬件负载平衡器/交换机。它们将来自用户的初始请求发送到服务器,来自该用户的下一个请求总是发送到同一服务器。 (或者他们尝试)

      这是为了只为一个网络应用程序共享会话,但为了在应用程序之间共享会话,我的工作是在用户登录时使用经典的 asp 会话(用于旧版支持,但 asp.net 也有效) ,它们是在 asp 上创建的,它们从名为 sessions.asp 的文件中读取(名称无关紧要),当从 .net 执行 Web 请求时,该文件返回值。

      例如:sessions.asp?session_name=username 从任何本地 .net 应用程序调用并响应“John”因此,“John”在 session["session_name"] 和 session.asp(或 aspx、php 或其他你想要的)只是将文本写入响应。

      我不确定它是否解释清楚......这是一种肮脏而简单的方法。在我的公司,我们为大约 300 个并发用户使用它,每个用户都有大量的会话,并且似乎工作得很好。希望能帮助到你。 ;-)

      【讨论】:

        【解决方案5】:

        使用缓存而不是会话来处理多个 Web 应用程序的直接方式之一。

        在这种情况下,缓存键将是用户 ID 和用户位置 IP 的组合。 因为缓存默认不会过期,所以你必须知道缓存的持续时间

        int timeout=20;
        string key= userid+System.Web.HttpContext.CurrentRequest.ServerVariables("REMOTE_ADDR");
        
        //Set 
        Cache.Insert(key, value, null,  DateTime.Now.AddMinutes(timeout), Cache.NoSlidingExpiration);    
        
        //Get
        var value=Cache[key];
        

        注销时不要忘记删除缓存

        Cache.Remove(key);
        

        【讨论】:

          猜你喜欢
          • 2019-04-03
          • 1970-01-01
          • 1970-01-01
          • 2012-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-23
          • 1970-01-01
          相关资源
          最近更新 更多