2010-05-19 15 views
43

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.Compartiendo sesiones entre aplicaciones usando el servicio de estado de sesión de ASP.NET

Ambas aplicaciones han puesto su sesión de esta manera:

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

En la solicitud de formulario web Estoy publicar la clave de la sesión para 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  
} 

entonces yo lo reciba en el Aplicación MVC e intente utilizar 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 publica pero la sesión no parece estar cargada en la aplicación MVC, es decir, sessionKey es nula. ¿Puedo hacer lo que estoy tratando de hacer?

+0

Puede publicar el código para publicar ID de sesión en otra aplicación – kk1076

+0

https://blogs.msdn.microsoft.com/toddca/2007/01/25/sharing-asp-net-session-state-across-applications/ – sotn

+0

El enlace en @sotn comment (https://blogs.msdn.microsoft.com/toddca/2007/01/25/sharing-asp-net-session-state-across-applications/) muestra cómo causar la sesión SQL proveedor para devolver la misma identificación de la aplicación para todas las aplicaciones, para que efectivamente compartan la misma sesión – AgapwIesu

Respuesta

68

lo hice de esta manera:

Básicamente la idea es utilizar ambas aplicaciones .NET nativo sessionState almacenado en SQL Server. 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: necesitaría db estado

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

Sesión que se creará en el servidor de base de datos, que ambas aplicaciones pueden ver.

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

de comandos que se tienen que ejecutar: C: \ Archivos de programa (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) 
+1

Para el procedimiento almacenado (suponiendo que no necesitará una solución más escalable), puede codificar el nombre de la aplicación: 'SET @appName = LOWER (" MyAppNameHere ")' –

+1

La vida no es tan perfecta. Esta solución tiene un error. Empecé a usarlo y me di cuenta de que las filas de sesiones obsoletas no se eliminan de db. Así que crece extremadamente y recibo una excepción "El registro de transacciones para la base de datos 'ASPState' está lleno." después de algún tiempo. ¿Cómo puedo arreglarlo? – RredCat

+0

Además ASPState_log.LDF takes ~ 50GB 8 | – RredCat

9

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

Puede hacer una de dos cosas:

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

  2. Desplace 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 de estado 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.

+0

Iba a sugerir el uso de la base de datos para la solución de gestión de sesión también. Es muy fácil de configurar, pero es posible que se encuentre con el mismo problema; diferentes aplicaciones tendrán claves diferentes y no podrán compartir datos. – Justin

+0

@Justin, no estoy sugiriendo que el OP use la sesión ASP.NET en SQL Server. Esto definitivamente tendrá el mismo problema, las claves de sesión en ASP.NET tienen un alcance para la aplicación, independientemente de la persistencia. Me refiero a que OP debería administrar por completo el almacenamiento de los datos compartidos "manualmente" y solo usar el mecanismo de sesión ASP.NET para los datos de la sesión específica de la aplicación, si es necesario. –

+0

@Dan, la cosa es que estás mezclando dos aplicaciones en un ámbito. Ahora no solo comparte los datos de la sesión, sino que tiene ambas aplicaciones cargadas en el mismo dominio de aplicación, donde los datos estáticos, las variables de la aplicación y la variable de caché pueden afectarse entre sí, simplemente porque desea compartir los datos de la sesión. –

0

Se puede utilizar una clave de equipo común para generar misma ID de sesión dentro de las aplicaciones para un usuario determinado. Además, también debe planificar el almacenamiento de las sesiones de ambas aplicaciones en una tienda común como ASP.NET State Service o un caché distribuido.

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.

Cuestiones relacionadas