这是我的问题。我有1个且只有1个网站供多个客户使用。要访问他们的数据,客户使用这样的网址: http://customer1.mysite.com http://customer2.mysite.com 等
每个客户都有一个带有数据的SqlServer实例。
取决于网站连接到正确的sql server实例的URL。这很好。
我的问题是关于会员资格,每个实例都有自己的“会员数据库”。在我的webconfig中,我配置了一个这样的虚拟部分:
<membership defaultProvider="MyMembershipProvider">
<providers>
<clear />
<add name="MyMembershipProvider"
type="MapApp.MyMembershipProvider, MyApp"
enablePasswordRetrieval="true"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Encrypted"
minRequiredPasswordLength="5"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
passwordStrengthRegularExpression=""
connectionStringName="A_DATABASE" />
</providers>
</membership>
我也有一个自定义的Membershipprovider,其代码如下:
public class MyMembershipProvider : SqlMembershipProvider
{
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
base.Initialize(name, config);
// Update the private connection string field in the base class.
string connectionString = "my new connection string depdend of the customer"
// Set private property of Membership provider.
FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
connectionStringField.SetValue(this, connectionString);
}
}
但是当我打电话给我的自定义会员提供商时,还有一些问题就像“已经实现”一样。
有人可以帮帮我吗?请...对不起我在这篇长篇文章中的糟糕英语
答案 0 :(得分:0)
这是一个有趣的问题。您似乎正在尝试根据URL为数据库使用不同的连接字符串。这可能不太优雅,但如何获取sql成员资格提供程序的代码并修改它,以便它使用的连接字符串基于用户URL。如果您真的只使用一个asp.net应用程序,我认为这可能是一个很好的解决方法。
答案 1 :(得分:0)
我想我有解决方案,但有点奇怪。
在我的customMemberShipProvider类中,即使我从不调用它,我也必须有一个空的构造函数。而且我需要另一个构造函数(即使我从未使用它也会使用args)。
所以这是我的代码:
public class myMembershipProvider : SqlMembershipProvider
{
public myMembershipProvider()
{
//never use
}
public myMembershipProvider(string dummyArg)
{
string configPath = "~/web.config";
Configuration config = WebConfigurationManager.OpenWebConfiguration(configPath);
MembershipSection section = (MembershipSection)config.GetSection("system.web/membership");
ProviderSettingsCollection settings = section.Providers;
NameValueCollection membershipParams = settings[section.DefaultProvider].Parameters;
if ((HttpContext.Current.Session != null) && (HttpContext.Current.Session["SubDomainInstanceName"] != null) && (!string.IsNullOrEmpty(HttpContext.Current.Session["SubDomainInstanceName"].ToString())))
{
membershipParams.Add("Instance", HttpContext.Current.Session["SubDomainInstanceName"].ToString());
}
else
{
membershipParams.Add("Instance", "default");
}
Initialize(section.DefaultProvider, membershipParams);
}
public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
{
//need to remove the key before call Initialize method
string instance = config["Instance"];
config.Remove("Instance");
base.Initialize(name, config);
// Update the private connection string field in the base class.
string connectionString = //my specific connectionstring;
// Set private property of Membership provider.
FieldInfo connectionStringField = GetType().BaseType.GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
connectionStringField.SetValue(this, connectionString);
}
此致