0

我已经成功构建了许多使用 ASP.NET Membership Provider 的应用程序。我正在潜入一个多租户的新项目,并且通过跨多个 SQL Server 数据库分区用户帐户来实现可扩展性。

每个数据库都安装了 Memberships 模式,通过在我的 Web.Config 文件中添加信息,我可以毫无问题地将任何一个数据库设置为我的 Membership 提供者。但是,我的目标是使用主数据库作为查找表。该数据库有一个名为“Accounts”的表,我将该帐户的成员资格数据库存储在一个名为“MebershipPartition”的字段中,该字段与该表中该帐户上的用户相关联(每个帐户可以有多个用户)。

这是基本架构,删除了无关信息:

在此处输入图像描述

我正在尝试做的是在我进行查找之后通过更新的连接字符串(或者甚至只是 databaseName,因为这都在同一个 SQL Server 上)将我的成员资格提供程序设置为该特定提供程序数据库。这意味着它必须发生在 Web.Config 和 Global.asax 文件之外。

我也无法使用可用连接字符串列表预先填充我的 Web.Config,因为只要满足某些条件,系统可能会生成一个新的会员数据库,例如达到以前数据库的某个上限或特定帐户需要它用户被隔离到一个单独的数据库中。所以这必须是完全动态的。

在我的研究中,我尝试了许多方法,这些方法在以下帖子中有详细介绍:

StackOverflowASP.NET 论坛ASP.NET 论坛

上述解决方案都没有按预期工作。要么他们依赖解决方案在应用程序生命周期中过早执行,要么他们对连接字符串使用硬编码值,只解决消除对 Web.Config 依赖的问题。

理想情况下,我想公开一个可以随时从 C# 类调用的方法,以便根据需要简单地切换成员系统使用的数据库,例如:

string Membership_DB_1 = "Server=[server];Database=database1;User ID=[userid];Password=[password];Trusted_Connection=False;Encrypt=True;"
string Membership_DB_2 = "Server=[server];Database=database2;User ID=[userid];Password=[password];Trusted_Connection=False;Encrypt=True;"
string Membership_DB_3 = "Server=[server];Database=database3;User ID=[userid];Password=[password];Trusted_Connection=False;Encrypt=True;"

Membership.SwitchConnectionString(Membership_DB_1);
Membership.SwitchConnectionString(Membership_DB_2);
Membership.SwitchConnectionString(Membership_DB_3);

我要提前感谢社区,我已经花了很多天(现在是几周)来解决这个问题,我已经接近转向另一个解决方案的地步了!

更新:

我也一直在研究以下解决方案,但同样 - 它需要提前设置 Web.Config 以及所有潜在的连接字符串,这从管理的角度来看是不可取的:

另一个硬编码解决方案

这是不可能的吗?接下来,我将考虑使用 Microsoft 提供的 Provider Toolkit Samples 来推出我自己的 Membership Provider 版本,但没有太多可用的示例或文档,而且实际的下载页面也不见了!Scott Guthrie在 2005 年发布了关于它的文章,但正如您所见,文章中的参考资料现在不见了。我最终在这里找到了 MSI 的下载链接,但我不确定代码是否维护得很好,甚至是否仍然相关......

我试图避免深入到 Provider 组件中,但我计划继续前进!当我去寻找任何其他想要做同样事情的人时,将保持这个线程的更新!

4

1 回答 1

0

您建议的切换连接字符串的方法:

Membership.SwitchConnectionString(Membership_DB_1);

听起来不切实际。不要忘记,有一个静态默认提供程序可以从多个请求线程同时访问,如果您调用此方法,您将更改所有线程的提供程序,这不太可能是您想要的。

我必须承认我看不到您提出的架构将如何增加可扩展性,但如果您确实想这样做,我认为您将不得不编写一个自定义提供程序。

于 2013-07-28T20:32:56.177 回答