2008-11-11 11 views
43

Estoy tratando de hacer un seguimiento de algo y utilizando el SessionID como clave para ese objetoSessionID sigue cambiando en ASP.NET MVC ¿por qué?

Sin embargo, el SessionID cada 2-3 cambios de reqiests no debería seguir siendo el mismo?

HttpContext.Session.SessionID 

Es el código que estoy usando.

Respuesta

47

He visto esto incluso sin MVC. Si mal no recuerdo, ASP.NET sigue asignando nuevas ID de sesión hasta que coloque algo en la variable Session.

+0

pierde la sesión incluso si pones algo en ello. La clave de la máquina dentro de web.config es lo único que soluciona ese problema –

+0

Solo si hubo una granja de servidores web involucrada. Y si lees el comentario del OP en una de las respuestas, encontrarás que agregar un elemento a la variable de sesión solucionó el problema. – Maxam

+0

Mi proveedor de hosting no tiene granja de servidores web, y agregar cosas a la sesión no lo arregla. Todavía lo pierdo después de unos minutos, incluso si tengo muchas cosas en la sesión (usuario de Loaded, su cesta de compras, ...) Intenté con 2 proveedores de hosting –

2

Me gustaría utilizar TempData para hacer un seguimiento de algo.

+0

En realidad todo lo que tenía que hacer era asignar una variable de sesión un valor y que hizo que se pegue .. – dswatik

0

Pruebe con la adición de clave de equipo en su web.config:
línea generador de claves: http://aspnetresources.com/tools/keycreator.aspx Parece que clave de equipo para restablecer el servidor del cliente y genera uno nuevo con el nuevo identificador de sesión, cada pocos minutos, lo que es mucho menor que debería. No sé si es un error o característica :)
Además, puede aumentar el tiempo de espera de estado de la sesión, que creo que es de 20 minutos por defecto.

5

estoy trabajando en un carro de aplicación .NET MVC y añadí

Session["myVar"] = "1234"; 

al método Load encontrado en el código Default.aspx.cs. También agregué

<%= this.Session.SessionID %> 

al Site.Master footer. Luego reconstruí mi aplicación y examiné las distintas páginas de mi aplicación y el pie de página muestra la misma identificación de sesión para todas las páginas, como era de esperar.

3

Si mira la identificación, la cookie de identificación ni siquiera se envía al navegador a menos que se use en el servidor.

Por lo tanto, cuando una página de ida y vuelta no tiene una cookie de ID de sesión actual, se crea una nueva ID de sesión, por lo tanto, es aleatoria.

Esto es lógico, ¿por qué molestarse en vincular la aplicación a una sesión si la sesión no está en uso?

24

Debe inicializar el objeto Session dentro de Global.asax.cs.

void Session_Start(object sender, EventArgs e) 
{ 
    HttpContext.Current.Session.Add("__MyAppSession", string.Empty); 
} 

De esta forma, la sesión no cambiará a menos que la ventana del navegador esté cerrada.

0

Estaba teniendo el mismo problema al utilizar ASP.NET Web Forms. Solo tuve que agregar un archivo global.asax a la solución y lo arreglé para mí.

0

Resumiendo las respuestas de @jrojo y @Maxam anteriores, con lo que estoy usando.

Estoy usando AWS DynamoDB como el almacén de sesiones (fuera del alcance de la pregunta un poco, pero da muestra).

Agregar paquete a través de Nuget: Instalar Paquete AWS.SessionProvider

Web Update.config para tener las llaves en appsettings:

<add key="AWSAccessKey" value="XXX" /> 
<add key="AWSSecretKey" value="YYY" /> 

y el proveedor de sesión para System.web:

<sessionState timeout="20" 
       mode="Custom" 
       customProvider="DynamoDBSessionStoreProvider"> 
    <providers> 
    <add name="DynamoDBSessionStoreProvider" 
     type="Amazon.SessionProvider.DynamoDBSessionStateStore, AWS.SessionProvider" 
     AWSProfilesLocation=".aws/credentials" 
     Table="ASP.NET_SessionState" 
     Region="us-east-1" 
     /> 
    </providers> 
</sessionState> 

añadir nada a la sesión en global.asax de inicio de sesión:

void Session_Start(object sender, EventArgs e) { 
    HttpContext.Current.Session.Add("somethingToForceSessionIdToStick", string.Empty); 
} 

Verificar por agregando esto a la afeitadora de cualquier página. Refrescar la página, a continuación, abra una ventana de Ignito y ver una sesión diferente:

@HttpContext.Current.Session.SessionID 

BobsYourUncle

Cuestiones relacionadas