我有一个在Web服务器根目录运行的ASP.NET Web应用程序,它通过使用URL重定向提供多个(类似的)Web站点.举一个现实世界的例子:
http://webshopserver/company1/ProductList.aspx -> http://webshopserver/ProductList.aspx?showProductsFrom=company1
http://webshopserver/company2/ProductList.aspx -> http://webshopserver/ProductList.aspx?showProductsFrom=company2
...
这很好用; 唯一的问题是,显然,所有这些不同的商店共享相同的会话对象(因为InProc会话管理器将会话对象存储在AppDomain中).我希望company1和company2的商店有不同的会话对象,例如,如果用户在同一浏览器窗口的不同选项卡中打开company1和company2的商店,则放入company1的购物车中的商品赢了不会出现在公司2的购物车中.
有一些明显的方法来解决这个我不喜欢的问题:
我正在考虑更多的解决方案:
因此,任何有关如何实现这些要点之一的信息(或者可能完全不同的解决方案)都会有所帮助.
最简单的解决方案不是更新对基于公司的动态密钥依赖于公司的Session对象的引用吗?
例如...
Session["IsTest"]
变
Session[createSessionKey(CompanyID, "IsTest")]
其中createSessionKey可能通过Company和Key的简单连接生成相应的键
然后,这将通过生成的密钥访问会话来区分两个或更多公司.
按照上面的例子,company1将通过密钥"company1_IsTest"访问"IsTest"会话变量,而company2将通过密钥"company2_IsTest"访问"相同"的"IsTest"会话变量.
希望你的代码库中没有像Session("IsTest")这样的东西,因为这会使你的代码重构变得非常痛苦.
通常我将Session变量抽象为强类型类.然后我的会话管理包含在一个地方.
如果所有Session变量都是公司特定的,那么使用具有基页面类并覆盖Session属性的想法是一个很好的方法.虽然如果您可以确定某个特定的会话密钥是通用的会话变量还是特定的公司变量,那么它仍然可行.