我有一个连接到多个数据库的 Web 应用程序实例。根据域名(例如 www.shop1.com、www.shop2.com、..),我在实体框架中切换连接字符串。

shop1.com -> Database1

shop2.com -> Database2

shop3.com -> Database3

到目前为止,一切都很好。

我也在使用 Sql Server 会话状态,并且我想切换会话状态数据库,就像我为数据切换数据库一样。

shop1.com -> SessionStateDatabase1

shop2.com -> SessionStateDatabase2

shop3.com -> SessionStateDatabase3

在此先感谢您的帮助。


如果您想知道我为什么这样做,请提供更多信息:

实际上我正在实施多租户。上面的描述显示了三个站点。事实上,我有50多个。未来几个月,网站数量将会增加。目前,所有站点都是单独部署的,这意味着每当我需要推出补丁或更新时,我都会部署所有 50 个站点。以这种方式维护网站正在成为一场噩梦。因此,我考虑在一个实例上放置 5 到 10 个站点,具体取决于它们的使用情况,这样我需要维护的实例就会更少。

有帮助吗?

解决方案

在这种情况下,我总是查看框架的源代码。首先,我找出配置存储会话状态连接字符串的位置,然后找到它的使用位置。私人课程 System.Web.SessionState.SqlSessionState.SqlSessionStateStore 有一个方法 OneTimeInit(), ,它读取连接字符串。这里我注意到有对partiniong的支持,参见这里: http://msdn.microsoft.com/en-us/library/aa478952.aspx 。我以前从未听说过这个,但看起来它完全符合您的要求,您可以根据您想要的任何类型的标准将会话状态存储在多个数据库中。顺便说一句,对于这个问题+1,这是一个很酷的功能。另外,如果它不起作用,您可以尝试实现您自己的 SessionStateStoreProviderBase 实现,该实现是公开可重写的。

其他提示

由于您的代码不管理会话状态连接,因此您将无法切换它。它是一种应用级别配置和超越代码控制。但不应出现对此的需求。单个服务器将能够为您拥有的所有三个域管理会话状态。唯一关注的问题可能是用户从shop1.com移动到shop2.com并仍保留旧会话。

有没有原因,您不会考虑运行(我假设,相同的代码)作为三个单独的Web应用程序?

  • 一个错误不会删除所有三个网站
  • 会话状态由应用程序分隔
  • 允许比例能力站点分配给不同的系统,因为增长决定
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top