迈克,我相信你观察到的是真的。我正在使用使用 Azure TableStorage 作为数据存储的 ProfileProvider。我想从数据库中获取用户配置文件列表,并将它们与会员提供者的信息合并。我花了一些时间才意识到使用用户名作为参数调用 ProfileBase.Create() 会对 TableStorage 进行查找并实际检索与该用户名关联的数据。就我而言,调用此方法Create()具有误导性,我希望Load()或Get()。目前我的代码如下所示:
public IEnumerable<AggregatedUser> GetAllAggregatedUsers()
{
ProfileInfoCollection allProfiles = this.GetAllUsersCore(
ProfileManager.GetAllProfiles(ProfileAuthenticationOption.All)
);
//AggregatedUser is simply a custom Class that holds all the properties (Email, FirstName) that are being used
var allUsers = new List<AggregatedUser>();
AggregatedUser currentUser = null;
MembershipUser currentMember = null;
foreach (ProfileInfo profile in allProfiles)
{
currentUser = null;
// Fetch profile information from profile store
ProfileBase webProfile = ProfileBase.Create(profile.UserName);
// Fetch core information from membership store
currentMember = Membership.FindUsersByName(profile.UserName)[profile.UserName];
if (currentMember == null)
continue;
currentUser = new AggregatedUser();
currentUser.Email = currentMember.Email;
currentUser.FirstName = GetStringValue(webProfile, "FirstName");
currentUser.LastName = GetStringValue(webProfile, "LastName");
currentUser.Roles = Roles.GetRolesForUser(profile.UserName);
currentUser.Username = profile.UserName;
allUsers.Add(currentUser);
}
return allUsers;
}
private String GetStringValue(ProfileBase profile, String valueName)
{
if (profile == null)
return String.Empty;
var propValue = profile.PropertyValues[valueName];
if (propValue == null)
return String.Empty;
return propValue.PropertyValue as String;
}
有没有更好(更直接、更高效)的方法
- 从配置文件提供程序检索所有自定义配置文件信息,并
- 将它们与会员提供者信息合并以显示它们,例如在管理员页面中?
我看过Web Profile Builder但 IMO 仅通过生成代理类为自定义配置文件属性提供设计时智能感知。