web-dev-qa-db-fra.com

SessionID ne cesse de changer dans ASP.NET MVC pourquoi?

J'essaie de garder une trace de quelque chose et d'utiliser le SessionID comme clé pour cet objet

Cependant, le SessionID toutes les 2 ou 3 modifications requises ne devrait-il pas rester le même?

HttpContext.Session.SessionID

Est-ce le code que j'utilise?.

44
dswatik

J'ai vu cela se produire même sans MVC. Si mes souvenirs sont bons, ASP.NET continue à affecter de nouveaux identifiants de session jusqu'à ce que vous placiez quelque chose dans la variable Session.

47
Maxam

Vous devez initialiser l'objet Session dans Global.asax.cs.

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

De cette façon, la session ne changera pas à moins que la fenêtre de votre navigateur ne soit fermée.

25
jrojo

Je travaille sur une application de panier .NET MVC et j'ai ajouté 

Session["myVar"] = "1234";

à la méthode Page_Load trouvée dans le code Default.aspx.cs. J'ai aussi ajouté 

<%=  this.Session.SessionID %>

au pied de page de Site.Master. J'ai ensuite reconstruit mon application et parcouru les différentes pages de mon application. Le pied de page affiche le même identifiant de session pour toutes les pages comme prévu!

5
robnardo

Si vous regardez le cookie ID de session n'est même pas envoyé au navigateur à moins qu'il ne soit utilisé sur le serveur.

Ainsi, lorsqu'une page fait un aller-retour, il n'y a pas de cookie d'ID de session en cours. Un nouvel ID de session est donc créé, il est donc aléatoire.

C'est logique, pourquoi s'embêter à relier l'application à une session si celle-ci n'est pas utilisée?

3
ScottEg

Je voudrais utiliser TempData pour garder trace de quelque chose.

2
MrJavaGuy

J'avais le même problème en utilisant ASP.NET Web Forms. Je devais simplement ajouter un fichier global.asax à la solution et le réparer pour moi.

0
Flea

Résumant les réponses de @jrojo et @Maxam ci-dessus, avec ce que j'utilise.

J'utilise AWS DynamoDB comme magasin de session (un peu en dehors de la question, mais donne un exemple).

Ajouter un package via NUGET: Install-Package AWS.SessionProvider 

Mettez à jour Web.config pour avoir les clés dans appSettings:

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

Et fournisseur de session à 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>

Ajoutez quelque chose à la session dans global.asax au début de la session:

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

Vérifiez en ajoutant ceci au rasoir de n'importe quelle page. Actualisez cette page, puis ouvrez une fenêtre ignito et voyez une autre session:

@HttpContext.Current.Session.SessionID

Bob est ton oncle

0
sobelito

Essayez d’ajouter une clé de machine dans votre web.config:
Générateur de clé en ligne: http://aspnetresources.com/tools/keycreator.aspx Il semble que le serveur réinitialise la clé d'ordinateur pour le client et en génère une nouvelle avec un nouvel identifiant de session, toutes les quelques minutes, est beaucoup plus bas qu'il ne le devrait. Je ne sais pas si c'est un bug ou une fonctionnalité :)
En outre, vous pouvez augmenter le délai d’exécution de votre session, ce qui correspond à 20 minutes par défaut.

0
Hrvoje Hudo