代码之家  ›  专栏  ›  技术社区  ›  Dan TheCodeJunkie

使用ASP.NET会话状态服务跨应用程序共享会话

  •  47
  • Dan TheCodeJunkie  · 技术社区  · 15 年前

    我正在尝试在两个Web应用程序之间共享会话,这两个应用程序都托管在同一台服务器上。一个是.NET 2.0 Web窗体应用程序,另一个是.NET 3.5 MVC2应用程序。

    两个应用程序的会话设置如下:

    <sessionState
          mode="StateServer"
          stateConnectionString="tcpip=127.0.0.1:42424"
          />
    

    在WebForm应用程序中,我将会话密钥发布到MVC应用程序:

    protected void LinkButton1_Click(object sender, EventArgs e)
    {
        Session["myvariable"] = "dan"; 
        string sessionKey = HttpContext.Current.Session.SessionID;
    
        //Followed by some code that posts sessionKey to the other application    
    }
    

    然后我在MVC应用程序中接收它,并尝试使用如下相同的会话:

    [HttpPost]
    public  void Recieve(string sessionKey )
    {
        var manager = new SessionIDManager();
    
        bool redirected;
        bool IsAdded;
    
         manager.SaveSessionID(HttpContext.ApplicationInstance.Context, Id, out redirected, out IsAdded);
         var myVar = Session["myvariable"];
    
    }
    

    正在发布密钥,但会话似乎未加载到MVC应用程序中,即session key为空。我想做的事能做吗?

    3 回复  |  直到 7 年前
        1
  •  71
  •   Knelis JeffRSon    10 年前

    我是这样做的:

    基本上,这两个应用程序都使用存储在sqlserver中的本机.NET会话状态。通过使用同一个机器密钥并对存储过程进行小调整,两个应用程序都可以共享任何会话密钥和/或表单授权。

    两个应用程序在web.config中都会这样做:

    <sessionState mode="SQLServer" sqlConnectionString="Data Source=.\SQLEXPRESS;User Id=test;Password=test;Application Name=AppName"  />
        <machineKey
    validationKey="SOMEKEY"
    validation="SHA1" decryption="AES"
    />
    

    会话状态数据库需要在数据库服务器上设置,这两个应用程序都可以看到。

    执行此操作的文档: http://msdn.microsoft.com/en-us/library/ms229862(VS.80).aspx

    需要运行的命令: C:\Program Files(x86)\Microsoft Visual Studio 9.0\vc\bin>aspnet\u regsql.exe-e-ssadd--sstype p-s。\sqlexpress

    存储过程(tempgetappid)调整为:

     @appId int OUTPUT
    AS
    
        -- start change
    
        -- Use the application name specified in the connection for the appname if specified
        -- This allows us to share session between sites just by making sure they have the
        -- the same application name in the connection string.
        DECLARE @connStrAppName nvarchar(50)
        SET @connStrAppName = APP_NAME()
    
        -- .NET SQLClient Data Provider is the default application name for .NET apps
        IF (@connStrAppName <> '.NET SQLClient Data Provider')
            SET @appName = @connStrAppName
    
        -- end change
    
    SET @appName = LOWER(@appName)
    
        2
  •  9
  •   Kenny Evitt    9 年前

    问题是会话密钥的作用域是应用程序,因此具有相同会话密钥的两个应用程序实际上具有不同的会话。

    你可以做两件事之一:

    1. 将这两个应用程序作为虚拟目录放在通用IIS应用程序下。我不认为这是个好主意,但它会奏效的。

    2. 为要共享的数据滚动您自己的会话数据解决方案。如果您有一个后端数据库,那么可以使用它作为公共存储。

    根据Justin的评论,澄清选项2并不是指进程外会话的SQL状态管理器。我的意思是您可以手动管理两个会话的共享数据,可能使用数据库。

        3
  •  0
  •   Shoeb Lodhi    7 年前

    您可以使用一个通用的机器密钥在给定用户的两个应用程序中生成相同的会话ID。此外,还应该计划将这两个应用程序的会话存储在一个公共存储区(如ASP.NET状态服务或分布式缓存)中。

    您可以使用ncache分布式缓存,它提供不同应用程序之间的会话共享功能。为会话状态设置内的两个应用程序指定相同的应用程序ID标记,如果两个应用程序都生成了相同的会话ID,则可以共享会话对象。