ASP.NET:单个应用程序中的多个Session对象

Hei*_*nzi 1 asp.net session

我有一个在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
...
Run Code Online (Sandbox Code Playgroud)

这很好用; 唯一的问题是,显然,所有这些不同的商店共享相同的会话对象(因为InProc会话管理器将会话对象存储在AppDomain中).我希望company1和company2的商店有不同的会话对象,例如,如果用户在同一浏览器窗口的不同选项卡中打开company1和company2的商店,则放入company1的购物车中的商品赢了不会出现在公司2的购物车中.

有一些明显的方法来解决这个我不喜欢的问题:

  • 创建我自己的Session对象,将所有内容封装到HashMap <CompanyName,无论是什么>中,然后将其存储在"真实"会话中:这会破坏使用会话对象的所有现有代码.
  • 使用http://company1.webshopserver/等URL 和通配符DNS记录,因为会话ID cookie与域绑定:这很丑陋(因为现实世界相当于"webshopserver"已经足够长了).
  • 编写我自己的自定义会话提供程序:这有点像重新发明轮子.
  • 为每家公司创建一个单独的IIS应用程序:无法工作,因为创建新公司应该可以通过http://webshopserver/CreateYourOwnWebshop.aspx之类的东西来实现,之后不需要任何人工(服务器管理员)干预.

我正在考虑更多的解决方案:

因此,任何有关如何实现这些要点之一的信息(或者可能完全不同的解决方案)都会有所帮助.

Bla*_*ael 7

最简单的解决方案不是更新对基于公司的动态密钥依赖于公司的Session对象的引用吗?

例如...

Session["IsTest"]
Run Code Online (Sandbox Code Playgroud)

Session[createSessionKey(CompanyID, "IsTest")]
Run Code Online (Sandbox Code Playgroud)

其中createSessionKey可能通过Company和Key的简单连接生成相应的键

然后,这将通过生成的密钥访问会话来区分两个或更多公司.

按照上面的例子,company1将通过密钥"company1_IsTest"访问"IsTest"会话变量,而company2将通过密钥"company2_IsTest"访问"相同"的"IsTest"会话变量.

希望你的代码库中没有像Session("IsTest")这样的东西,因为这会使你的代码重构变得非常痛苦.

通常我将Session变量抽象为强类型类.然后我的会话管理包含在一个地方.

如果所有Session变量都是公司特定的,那么使用具有基页面类并覆盖Session属性的想法是一个很好的方法.虽然如果您可以确定某个特定的会话密钥是通用的会话变量还是特定的公司变量,那么它仍然可行.