我有多个个人资料提供者和个人资料类型:
带有ProviderA
的 ProfileA
和
ProviderB
与ProfileB
他们都使用不同的数据库。我希望能够说:
ProfileB.Create(...)
,配置文件在数据库B中创建,而ProfileA.Create(...)
在数据库A中创建配置文件。
我该如何在web.config中配置它?
以下(当然)无效:
<profile inherits="ProfileA, Authenticatie" defaultProvider="ProfileProviderA" enabled="true" automaticSaveEnabled="true">
<providers>
<add name="ProfileProviderA" applicationName="websiteA" type="ProfileProviderA, Authenticatie" connectionStringName="connstringA" description=""/>
</providers>
</profile>
<profile inherits="ProfileB, Authenticatie" defaultProvider="ProfileProviderB" enabled="true" automaticSaveEnabled="true">
<providers>
<add name="ProfileProviderB" applicationName="websiteB" type="ProfileProviderB, Authenticatie" connectionStringName="connstringB" description=""/>
</providers>
</profile>
答案 0 :(得分:3)
我已使用以下hack解决了多个配置文件和提供程序:
首先:为您的个人资料创建一个基类。它不必包含所有字段;它们共享相同的基类(我称之为CustomProfileBase
)非常重要。
此外,配置中的以下更改:
<强>的app.config 强>
<system.web>
<membership defaultProvider="CustomSqlProviderA" userIsOnlineTimeWindow="15">
<providers>
<clear/>
<add name="CustomSqlProviderA" applicationName="websiteA" type="Authenticatie.A.CustomMembershipProvider, Authenticatie" description="A Membership" connectionStringName="profilesA" />
<add name="CustomSqlProviderB" applicationName="websiteB" type="Authenticatie.B.CustomMembershipProvider, Authenticatie" description="B Membership" connectionStringName="profilesB" />
</providers>
</membership>
<profile inherits="Authenticatie.CustomProfileBase, Authenticatie" defaultProvider="AProfielen" enabled="true">
<providers>
<add name="AProfielen" applicationName="websiteA" type="Authenticatie.A.CustomProfileProvider, Authenticatie" connectionStringName="profielenA" description="A"/>
<add name="BProfielen" applicationName="websiteB" type="Authenticatie.B.CustomProfileProvider, Authenticatie" connectionStringName="profielenB" description="B"/>
</providers>
</profile>
</system.web>
<强>码强>
// find the membershipprovider based on the property 'website'
var membershipProvider = Membership.Providers.Cast<MembershipProvider>().Single(s => s.ApplicationName == (website == Website.A ? "websiteA" : "websiteB"));
// find the according profileProvider
var profileProvider = ProfileManager.Providers[website == Website.A ? "AProfielen" : "BProfielen"];
// here's the hacky part. There is a static field on the ProfileManager
// that needs to be set. 'Membership' uses the ProfileManager to retrieve
// and store the profile; so it's pretty much the only way
FieldInfo cPr = typeof(ProfileManager).GetField("s_Provider", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
cPr.SetValue(null, profileProvider);
// Now we can retrieve the current user through our selected membershipProvider
var user = membershipProvider.GetUser(gebruikersData.EmailAdres, false);
if (user == null)
{
// create user:
membershipProvider.CreateUser(mail, password, mail, null, null, true, null, out createStatus);
// create according profile. ProfileBase uses Membership internal.
var profile = (CustomProfileBase)ProfileBase.Create(mail);
// set the default values, you can upcast your profile again
profile.Save();
}
现在,我们已在相应数据库中创建了一个用户以及一个配置文件。您可以通过membershipProvider
检索用户,通过ProfileManager.FindProfilesByUserName()
检索个人资料。
答案 1 :(得分:0)
你在web.config中不能有超过1个配置文件,但是配置文件可以有多个提供者,所以你应该开始考虑将你的架构改为只有1个配置文件,甚至可以将它们混合在一起。那你就有了这种web.config:
<profile inherits="ProfileA" defaultProvider="ProfileProviderA" enabled="true" automaticSaveEnabled="true">
<providers>
<add name="ProfileProviderA" applicationName="websiteA" type="ProfileProviderA, Authenticatie" connectionStringName="connstringA" description=""/>
<add name="ProfileProviderB" applicationName="websiteB" type="ProfileProviderB, Authenticatie" connectionStringName="connstringB" description=""/>
</providers>
<properties>
<clear/>
<add name="property1" type="type1" provider="ProfileProviderA" />
<add name="property2" type="type2" provider="ProfileProviderB" />
</properties>
</profile>
另一个解决方案是根据您的配置文件将您的网站划分为2个子目录/子应用程序,并在每个子应用程序中创建自己的web.config并使用所需的配置文件。