2009-11-10 4 views
3

J'écris une application dans ASP.NET MVC. Fondamentalement, j'ai quelques pages qui nécessitent l'authentification de l'utilisateur. Lors de la connexion de l'utilisateur, je conserve la ligne de l'utilisateur dans une session. Donc, dans mon contrôleur, je peux accéder à l'user.ID sans faire de requêtes supplémentaires.Asp MVC, est la session perdue lors de la construction de la solution?

Lorsque le projet est en mode débogage, je ne peux que changer les choses dans les vues. Pas dans le contrôleur.

Si je ne débogue pas, je peux construire la solution, et voir les changements que j'ai faits sans exécuter le projet (avec F5). MAIS, il perd toutes les variables de session que j'ai.

Donc, fondamentalement, pour chaque petit changement du contrôleur, je dois me déconnecter, connectez-vous pour voir mes changements.

Ces comportements sont-ils normaux?

Répondre

2

Comme Dan a déclaré, ce comportement est normal. Pour le rendre plus facile (et légèrement plus robuste), changez légèrement votre code. Cela suppose bien sûr que vous stockiez plus que l'ID utilisateur en session puisque vous pouvez accéder à l'ID utilisateur via Controller.User.Identity.Name lorsqu'ils sont authentifiés. Vous effectuez donc la recherche des données supplémentaires dans l'objet de session et si elle ne renvoie pas la valeur null, utilisez-la. S'il renvoie null, recherchez à nouveau les informations supplémentaires en fonction de l'ID utilisateur et stockez-le de nouveau dans la session. C'est l'approche que je prends pour stocker des informations à partir d'Active Directory et cela fonctionne très bien.

+0

Oui, je le ferai. Mais est-ce que ce n'est pas db intensif d'interroger la base de données sur chaque page pour obtenir les détails de l'utilisateur? – gong

+0

C'est pourquoi vous vérifiez d'abord la session. Vous interrogez uniquement la base de données si la session est null. –

2

Oui, il s'agit d'un comportement normal d'ASP.NET dans son ensemble et pas seulement de MVC.

Si vous devez recompiler (par exemple, un changement de contrôleur ou d'objet métier), vous serez dans une nouvelle session lorsque vous exécuterez le débogage. Comme vous le dites, seules les modifications de vues ou de pages (qui ne nécessitent pas de recompilation) vous permettront de voir les changements dans la même session.

Bonté,

Dan

+0

Alors, comment déboguer de gros projets? Est-ce que vous vous déconnectez toujours, loggon pour voir les changements? Pouvons-nous conserver les détails de l'utilisateur ailleurs? Par exemple Request.IsAuthenticated est vrai en plus du fait que la session est perdue. Puis-je enregistrer des informations d'identification ici? – gong

+0

@gong Jetez un oeil à ma réponse ci-dessous pour la manipulation de l'information. –

1

La recompilation effacera toutes les données de session en cours. Cependant, il ne supprimera pas votre ticket d'authentification, il est stocké en tant que cookie, donc vous pouvez faire quelques choses pour éviter cela.

  1. Si vous avez seulement besoin d'accéder à l'ID utilisateur puis utilisez User.Indentity.Name

  2. Si vous avez seulement besoin de données d'utilisateur de base à des fins d'affichage, telles que le nom de l'utilisateur, vous pouvez stocker que dans un cookie de session . Avertissement: effectuez cette opération uniquement pour afficher des données, sauf si vous cryptez les données de cookie. Les données de cookie en texte brut ne doivent pas être approuvées.

  3. Si vos données d'utilisateur est plus complexe que celui de consulter ensuite les données par une méthode qui utilise la mise en cache comme suggéré par Agent_9191

Ajouter quelque chose comme ceci à un contrôleur de base ou Méthode d'extension

protected UserData GetUserData() { 
    UserData user = HttpContext.Session["User"] as UserData; 
    if (user == null) { 
    user = UserDataRepository.GetUser(User.Identity.Name); 
    HttpContext.Session.Add("User", user); 
    } 
    return user; 
} 
Questions connexes