ASP.NET: Plusieurs objets de Session dans une seule application
J'en ai un ASP.NET web application en cours d'exécution à la racine du serveur web qui offre plusieurs (même) les sites web à l'aide de la redirection d'URL. Pour donner un exemple réel:
http://webshopserver/company1/ProductList.aspx -> http://webshopserver/ProductList.aspx?showProductsFrom=company1
http://webshopserver/company2/ProductList.aspx -> http://webshopserver/ProductList.aspx?showProductsFrom=company2
...
Cela fonctionne très bien; le seul problème est que, évidemment, toutes ces boutiques différentes partagent le même objet session (depuis le InProc session manager stocke l'objet de session dans le domaine d'application). Je voudrais les magasins de l'entreprise1 et entreprise2 différents objets de session, de sorte que, par exemple, si un utilisateur ouvre les boutiques de l'entreprise1 et entreprise2 dans les différents onglets de la même fenêtre de navigateur, les articles mis dans le panier de l'entreprise1 de ne pas s'afficher dans le panier de l'entreprise2.
Il ya quelques approches pour résoudre ce problème que je n'aime pas:
- Créer ma propre Session de l'objet qui encapsule le tout dans une HashMap<nom de la Société, quelle que soit>, puis la stocke dans la "vraie" session: Qui casse tout le code existant qui utilise l'objet session.
- Utiliser des Url comme http://company1.webshopserver/ et un enregistrement DNS générique, parce que le cookie de session est liée au domaine: C'est moche (parce que le monde réel équivalent de "webshopserver" est déjà assez long).
- Écrire ma propre Session Fournisseur de: ce serait un peu comme de réinventer la roue.
- Créer une application IIS distincts pour chaque entreprise: ne fonctionne pas, parce que la création de nouvelles entreprises devrait être possible grâce à quelque chose comme http://webshopserver/CreateYourOwnWebshop.aspx sans aucune intervention humaine (l'admin du serveur) l'intervention par la suite.
Je pense plus de la solution le long des lignes de:
- limitant le chemin du cookie de session à /" >http://webshopserver/<société>/ ou
- dire ASP.NET à l'utilisation de différents domaines d'application en fonction de l'URL.
Donc, aucune information sur la manière d'atteindre un de ces points (ou peut-être une solution différente en tout) serait utile.
- Désolé, j'ai raté le no-go sur des applications IIS. Est-ce une auto hébergé application ou de l'exécution sur un environnement partagé où vous venez d'avoir accès au panneau de contrôle?
- Pas de problème, merci pour votre réponse de toute façon. C'est (actuellement) un auto-hébergé app.
Vous devez vous connecter pour publier un commentaire.
Ne serait pas la solution la plus simple à mettre à jour les références à la Session d'objets qui leur sont dépendants avec une clé dynamique de la Société?
Par exemple...
devient
où createSessionKey génère la clé correspondante peut-être par une simple concaténation de la Société et les Principaux
Ce serait alors la distinction entre les deux entreprises ou plus, en accédant à la session via des clés générées.
Suivant l'exemple ci-dessus, entreprise1 permettrait d'accéder à la "IsTest" variable de Session via la touche "company1_IsTest" et entreprise2 permettrait d'accéder à la "même" "IsTest" variable de Session via la touche "company2_IsTest".
Espérons que vous n'avez pas des choses comme la Session("IsTest") éparpillées dans votre base de code qui permettrait de faire du refactoring de votre code une vraie douleur.
Généralement j'ai résumé mes variables de Session dans une classe fortement typée. Puis ma gestion de session est contenue dans un seul endroit.
À l'aide de l'idée d'avoir une Page de base de la classe et de la substitution de la propriété de Session est une belle façon d'aller si vous avez des variables de Session sont spécifiques à la société. Mais si vous pouvez déterminer si un particulier de la clé de Session est un générique de variable de Session ou d'une société particulière, puis il peut toujours être pratique.
Je suggère d'écrire votre propre session de wrapper. Voici un bon exemple de Martin dans une autre question:
Comment accéder à des variables de session à partir de n'importe quelle classe de ASP.NET?
Selon la façon dont vous êtes l'ajout et la récupération des éléments et de la Session (et éventuellement dépend de si vous tirez vos pages à partir d'une base commune de page), vous pourriez être en mesure de faire une coutume objet qui encapsule la session sans casser tout votre code (comme indiqué dans la première option lorsque vous avez une session wrapper mise en œuvre d'un algorithme de hachage carte assortie, par site). Si vous créez un objet personnalisé et exposer comme "Session" à la base au niveau de la page, il aura la priorité sur l'objet de Session vous hériter de la classe Page. Ensuite, votre objet personnalisé peut remplacer les indexeurs et prendre la décision où dans la table de hachage pour stocker cet objet basé sur l'url de la requête de l'actuel http contexte.
Si vous n'êtes pas dériver à partir d'une base commune de page, ce qui va un peu par la fenêtre parce que vous auriez à mettre en place une page de base pour toutes les pages de dériver à partir de ou ajouter du code à chaque page pour obtenir une référence à l'objet. Juste une idée...
De la création de votre propre Session wrapper, ou une Séance personnalisée Fournisseur serait le droit réponse. Mais, vous pourriez être en mesure de pirater les données de session en tant que l'utilisateur passe à une autre société avec un HttpModule accroché à PostAcquireRequestState.
Fondamentalement, comparer cette ProductsFromCompany avec la précédente ProductsFromCompany. Si ils sont différents, déplacer, toutes les valeurs de Session à un
Dictionary<string, object>
(ou ajouter un id d'entreprise) et restaurer les sauvésDictionary<string, object>
pour cette ProductsFromCompany à la Session.Quelque chose comme: