web-dev-qa-db-fra.com

Toujours acceptable d'utiliser des variables de session dans ASP.NET mvc

Je dois accéder à un panier de plusieurs pages. Ainsi, sur la page du produit - créez le panier et ajoutez quelques articles Sur la page de paiement du panier - confirmez l'adresse de facturation. hors paiement

Ma question est la suivante: quel est le meilleur moyen de contourner le panier?

J'ai essayé de passer du panier de page à postback et de garder toutes les valeurs en vie, mais sur certaines pages (la page de confirmation de l'adresse de facturation), cela me semble beaucoup de soucis. de HiddenFor () sur la page pour reconstituer le panier

TempData [] est ce que j’ai utilisé pour le produit sur la page de paiement, puis je me suis demandé s’il était préférable de continuer à régler TempData tout le temps quand ....

vous pouvez simplement utiliser une variable de session?

Pour une raison quelconque, je lis que ce n’est pas une pratique géniale d’utiliser Session, d’où la question.

Merci pour vos conseils, je peux vous fournir du code/plus d’informations si vous le jugez utile.

37
Keeno

Il est parfaitement correct d’utiliser des sessions dans ASP.NET MVC, en particulier dans le cas du panier que vous utilisez. 

Il y a des inconvénients à utiliser des sessions, mais elles ne semblent pas s'appliquer à votre cas:

1) Les sessions empêchent un utilisateur de naviguer correctement sur votre site à partir de plusieurs onglets de navigateur, les modifications apportées dans un onglet sont reflétées dans tous les autres . Mais avec un panier, c'est exactement ce dont vous avez besoin. Vous n'avez pas besoin de plusieurs paniers d'achat par utilisateur, n'est-ce pas?

2) Les sessions ne sont pas persistantes par défaut, et si vous travaillez sur une webfarm, vous devez enregistrer les sessions de votre base de données pour qu'elles soient accessibles à tous les nœuds de la batterie . comme ça. Et si vous rencontrez le besoin de mise à l'échelle, les sessions ne seront pas votre principal problème.

3) Les sessions nécessitent des fonctionnalités supplémentaires de la part du navigateur de l'utilisateur (généralement des cookies). Mais les navigateurs modernes supportent tous les cookies, vous n'avez donc qu'à vous préoccuper des navigateurs très spéciaux.

Les sessions offrent également certains avantages par rapport aux entrées cachées:

1) Les plus petits frais généraux. Seul un petit cookie de session est échangé entre vous et le client, plutôt que l'ensemble des entrées masquées.

2) Programmation plus simple. Vous n'avez pas à vous assurer que vous avez inclus vos entrées masquées dans chacune de vos pages.

3) la sécurité. Le client peut modifier le contenu des entrées cachées comme bon lui semble. Vous ne pouvez pas facilement transmettre des informations sensibles via des entrées cachées, vous devez les chiffrer. Les valeurs de session sont stockées sur le serveur, le client n'y a donc pas accès.

56
Zruty

Les sessions sont correctes, mais considérons le système de style Amazon qui émet un cookie de reconnaissance même lorsque vous n'êtes pas connecté. Cela leur permet de stocker votre panier dans la base de données, en le comparant au cookie de reconnaissance. 

Le résultat est que vous évitez l'expérience utilisateur horrible de perdre votre panier en raison du délai d'expiration de la session/du recyclage du domaine d'application du serveur (ce dernier est atténué par l'utilisation du stockage de session SQLState, que je recommande). L'utilisateur peut revenir quelques jours plus tard et son panier sera toujours là. À moins que ce ne soit un problème de sécurité/confidentialité, je trouve que c'est la meilleure solution.

11
James McCormack

Il est tout à fait correct d’utiliser une session avec l’application asp.net mvc. steve sanderson a utilisé session for cart dans l'exemple d'application fourni avec son livre. Le code est disponible ici

10

J'utiliserais Session, à moins qu'il y ait des raisons de l'éviter. 

Par exemple, j'ai un projet dans lequel j'ai répété des appels à une action MVC en arrière-plan. Cette action sert un fichier qui est lent sur le réseau. J'avais l'habitude d'utiliser Session, mais j'ai rapidement découvert le principal effet indésirable: IIS n'exécutera pas les appels du même utilisateur en parallèle, mais uniquement les uns après les autres. Cela a eu un impact considérable sur les performances. J'ai donc utilisé une méthode alternative: j'ai défini HttpContext.User.Identity sur le nom d'utilisateur et je l'ai utilisé comme clé pour extraire des éléments de la base de données. Mais vous pouvez probablement le définir sur un GUID aléatoire et le remplacer par des sessions.

5
Palantir

Pour un panier, vous devez absolument ne pas utiliser l'état de session. Une bonne approche consiste à utiliser le module d'identification anonyme pour gérer un cookie pour vous. Tout ce dont vous avez besoin est d’une ligne dans web.config.

<system.web>
    <anonymousIdentification enabled="true" />
</system.web>

Ensuite, à chaque demande, vous pouvez utiliser la propriété Request.AnonymousID (qui renvoie une chaîne représentant un GUID) pour rechercher le panier dans la base de données.

public ActionResult ShowCartDetails()
{
    var CartId = new Guid(Request.AnonymousID);

    // Lookup cart...

    return View();
}

Ce n'est pas seulement plus efficace que d'utiliser l'état de session, c'est aussi plus simple.

Références:

3
NightOwl888

J'ai tendance à utiliser un cookie avec mon panier sérialisé en base64 string, cela semble bien fonctionner

2
simonlchilds

Dans le système de panier, les produits ajoutés au panier sont très importants, donc utiliser session n'est pas une bonne idée à mon avis. L'utilisation de cookies et d'une table temporaire dans la base de données est l'une des meilleures idées. Nous pouvons stocker ces données pour toujours ou les effacer après certains jours. 

0
Ujwal Neupane