Compartir sesiones entre aplicaciones utilizando el servicio de estado de sesión de ASP.NET

Estoy tratando de compartir sesiones entre dos aplicaciones web, ambas alojadas en el mismo servidor. Una es una aplicación de formularios web .net 2.0 y la otra es una aplicación .NET 3.5 MVC2.

Ambas aplicaciones tienen su sesión configurada de esta manera:

 

En la aplicación webform, estoy publicando la clave de sesión en la aplicación 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 } 

Luego lo recibo en la aplicación MVC y trato de usar la misma sesión como esta:

 [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"]; } 

La clave se está publicando, pero parece que la sesión no se carga en la aplicación MVC, es decir, sessionKey es nula. ¿Puedo hacer lo que estoy tratando de hacer?

Lo hice de esta manera:

Básicamente, la idea es que ambas aplicaciones usen .Net sessionState nativo almacenado en sqlserver. Al usar la misma clave de máquina y hacer un pequeño ajuste a un procedimiento almacenado, ambas aplicaciones pueden compartir las claves de sesión y / o la autenticación de formularios.

Ambas aplicaciones harían algo como esto en su web.config:

   

El estado de sesión db debería configurarse en un servidor de base de datos, que ambas aplicaciones pueden ver.

Documentos para hacer esto: http://msdn.microsoft.com/en-us/library/ms229862(VS.80).aspx

Comando que debería ejecutarse: C: \ Archivos de progtwig (x86) \ Microsoft Visual Studio 9.0 \ VC \ bin> aspnet_regsql.exe -E -ssadd –sstype p -S. \ SQLEXPRESS

Procedimiento almacenado (TempGetAppID) ajustar a:

  @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) 

El problema es que las claves de sesión tienen un scope para las aplicaciones, por lo que dos aplicaciones que tienen la misma clave de sesión tienen sesiones separadas.

Puedes hacer una de las dos cosas:

  1. Coloque ambas aplicaciones como un directorio virtual bajo una aplicación IIS común. No creo que sea una buena idea, pero funcionará.

  2. Haga rodar su propia solución de datos de sesión para los datos que desea compartir. Posiblemente utilizando la base de datos back-end como el almacenamiento común, si tiene uno.

Según el comentario de Justin, solo para aclarar la opción 2 no se está haciendo referencia al administrador del estado de SQL para las sesiones fuera de proceso. Me refiero a que realmente administres manualmente los datos compartidos para las dos sesiones, posiblemente usando una base de datos.

Puede usar una clave de máquina común para generar la misma ID de sesión dentro de ambas aplicaciones para un usuario dado. Además, también debe planificar el almacenamiento de sesiones de ambas aplicaciones en una tienda común, como ASP.NET State Service o una memoria caché distribuida.

Puede usar la memoria caché distribuida de NCache, que proporciona la característica de compartir sesión entre diferentes aplicaciones. Usted especifica la misma etiqueta de ID de aplicación para ambas aplicaciones dentro de la configuración de estado de la sesión, lo que le permite compartir el objeto de sesión siempre que tenga la misma ID de sesión generada para ambas aplicaciones.