Why can't I share Session state between 2 web apps with StateServer? What am I missing?

前端 未结 4 393
情深已故
情深已故 2020-12-10 14:07

I\'m having trouble getting 2 identical ASP.NET MVC applications to share the same Session using a Session StateServer. The reason I\'m trying to do this is we will eventual

相关标签:
4条回答
  • 2020-12-10 14:35

    By default session cannot be shared between different applications. From what I can see you have two distinct applications App1 and App2 which run in separate virtual directories and probably even separate application pools, so don't expect to share session between them.

    As always there are workarounds that you may find useful. As you can see it's using a hack (reflection) to circumvent ASP.NET team designer's determination to not expose certain classes and properties and make our life as developers difficult.

    0 讨论(0)
  • 2020-12-10 14:37

    Actually you can share sessions using Sql server mode.

    Try this:-

    I just changed the procedure i.e.

    USE ASPState
    GO
    
    ALTER PROCEDURE dbo.TempGetAppID
        @appName tAppName,
        @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)
    SET @appId = NULL
    
    SELECT @appId = AppId
    FROM [ASPState].dbo.ASPStateTempApplications
    WHERE AppName = @appName
    
    IF @appId IS NULL BEGIN
    BEGIN TRAN 
    
    SELECT @appId = AppId
    FROM [ASPState].dbo.ASPStateTempApplications WITH (TABLOCKX)
    WHERE AppName = @appName
    
    IF @appId IS NULL
    BEGIN
    EXEC GetHashCode @appName, @appId OUTPUT
    
    INSERT [ASPState].dbo.ASPStateTempApplications
    VALUES
    (@appId, @appName)
    
    IF @@ERROR = 2627 
    BEGIN
    DECLARE @dupApp tAppName
    
    SELECT @dupApp = RTRIM(AppName)
    FROM [ASPState].dbo.ASPStateTempApplications 
    WHERE AppId = @appId
    
    RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.', 
    18, 1, @appName, @dupApp)
    END
    END
    
    COMMIT
    END
    
    RETURN 0 
    GO
    

    and then modified web.config as:-

    <sessionState mode="SQLServer" sqlConnectionString="Data Source=.;Integrated Security=True;Application Name=TEST" cookieless="false" timeout="20"></sessionState>
       <httpRuntime targetFramework="4.5"/>
    

    You have to add Application Name and that have to be the same for all the application for which you want to share the same session.

    Thanks.

    0 讨论(0)
  • 2020-12-10 14:39

    You also have to make sure that the application path for the app has to be the same on both web servers. There is an old article here that might help

    http://support.microsoft.com/default.aspx?scid=kb;EN-US;q325056

    We are currently experiencing a similar problem, except that we are using IIS 7.5 and the application paths are hidden to us (does not use the metabase anymore). Does anyone know a way of troubleshooting this with IIS 7.5?

    0 讨论(0)
  • 2020-12-10 14:48

    Update: Here is a previous post I answered on this same topic Sharing sessions across applications using the ASP.NET Session State Service

    As already pointed out, Session data is scoped to the application. That is the Application you create in IIS. So two applications with the same session id will not be sharing the same session because of the application scoping.

    As an alternative idea that might or might not be feasible for you. You can create a root application and have the code for D:\App1 and D:\App2 in two subfolders.

    d:\Root
      web.config
      \App1
         default.aspx
         ...
      \App2
         default.aspx
         ...
    

    Then in IIS you create an Application pointing to d:\Root.

    You can also create an Application in IIS and then under the Application you create two virtual directories, one pointing to D:\App1 and the other to D:\App2, then they can also share a single web.config at the Application level. It is critical that the two virtual directories are just virtual and not created as Applications.

    So you harddisk layout might look something like this

    D:\Root
      web.config
    
    D:\App1
      default.aspx
      ...
    
    D:\App2
      default.aspx
      ...
    

    Create the root application pointing to D:\Root and then under the application create the two virtual directories App1 pointing to D:\App1 and App2 pointing to D:\App2.

    The effect in both cases is that you actually have one application split into two sections, both in the same Session scope therefore the code for both can share the same session data.

    0 讨论(0)
提交回复
热议问题