【发布时间】:2009-04-06 16:20:11
【问题描述】:
我有一个在 Web 服务器根目录运行的 ASP.NET Web 应用程序,它通过使用 URL 重定向提供多个(相似的)网站。举一个现实世界的例子:
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 购物车的商品会赢'不会出现在 company2 的购物车中。
有一些我不喜欢的明显方法来解决这个问题:
-
创建我自己的 Session 对象,它将所有内容封装到一个 HashMap
中,然后将其存储在“真实”会话中 :这会破坏所有使用会话对象的现有代码。 - 使用像 http://company1.webshopserver/ 这样的 URL 和通配符 DNS 记录,因为会话 ID cookie 与域相关:这很难看(因为现实世界中相当于“webshopserver”的时间已经够长了)。
- 编写我自己的自定义会话提供程序:这有点像重新发明轮子。
- 为每个公司创建一个单独的 IIS 应用程序:行不通,因为应该可以通过 http://webshopserver/CreateYourOwnWebshop.aspx 之类的方式创建新公司,之后无需任何人工(服务器管理员)干预。
我正在考虑更多的解决方案:
- 将会话 cookie 的路径限制为 http://webshopserver/<companyName>/ 或
- 告诉 ASP.NET 根据 URL 使用不同的 AppDomain。
因此,任何有关如何实现其中一个点(或完全不同的解决方案)的信息都会有所帮助。
【问题讨论】:
-
对不起,我错过了单独的 IIS 应用程序上的禁止使用。这是一个自托管的应用程序还是在您只能访问控制面板的共享环境中运行?
-
没问题,无论如何感谢您的回答。它(目前)是一个自托管的应用程序。