Пользовательский поставщик членства ASP.NET MVC3 - указанное имя поставщика членства недействительно.

Я реализую настраиваемого поставщика членства, и, кажется, все идет гладко, пока я не создаю объект MembershipUser. В этот момент я получаю сообщение об ошибке:

Указано недопустимое имя поставщика членства. Имя параметра: providerName

В web.config ключ членства

<membership defaultProvider="MembersProvider">
  <providers>
    <clear/>
    <add name="MembersProvider" type="Members.Providers.MembersProvider" connectionStringName="ApplicationServices"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="DeviceDatabase" />
  </providers>
</membership>

При создании объекта MembershipUser из моего пользовательского класса User:

    public static MembershipUser ToMembershipUser(User user)
    {
        MembershipUser member = new MembershipUser
            ("MembersProvider"
            , user.Name
            , user.Id
            , user.EmailAddress
            , user.PasswordQuestion
            , user.Comment
            , user.IsApproved
            , user.IsLockedOut
            , user.DateCreated
            , user.LastLoginDate ?? DateTime.MinValue
            , user.LastActivityDate ?? DateTime.MinValue
            , user.LastPasswordChangedDate ?? DateTime.MinValue
            , user.LastLockoutDate ?? DateTime.MinValue
            );

        return member;
    }

(Я понимаю, что мог бы просто унаследовать свой класс User от MembershipUser, но он уже является частью существующей иерархии классов. Честно говоря, я думаю, что это первый раз, когда я столкнулся с законной потребностью в множественном наследовании!)

Мне кажется, что параметр new MembershipUser(...) providerName должен соответствовать тому, что задано в web.config, но, поскольку они уже совпадают, я не понимаю, как действовать дальше.

Есть ли удобный способ получить имя активного поставщика членства в коде?

Я начинаю думать, что использование встроенной системы членства - это излишнее и больше проблем, чем оно того стоит.

Изменить. Не уверен, что это актуально, но класс настраиваемого поставщика членства находится в библиотеке классов, а не в основном проекте WAP.

Обновить Вот содержимое объекта System.Web.Security.Membership.Provider, отображаемое в командном окне VS2010:

>eval System.Web.Security.Membership.Provider
{Members.Providers.MembersProvider}
    [Members.Providers.MembersProvider]: {Members.Providers.MembersProvider}
    base {System.Configuration.Provider.ProviderBase}: {Members.Providers.MembersProvider}
    ApplicationName: null
    EnablePasswordReset: true
    EnablePasswordRetrieval: false
    MaxInvalidPasswordAttempts: 5
    MinRequiredNonAlphanumericCharacters: 0
    MinRequiredPasswordLength: 6
    PasswordAttemptWindow: 10
    PasswordFormat: Function evaluation was aborted.
    PasswordStrengthRegularExpression: Cannot evaluate expression because debugging information has been optimized away .
    RequiresQuestionAndAnswer: Cannot evaluate expression because debugging information has been optimized away .
    RequiresUniqueEmail: Cannot evaluate expression because debugging information has been optimized away .

Обновление 2

Это просто случайно начало работать, что означает, что я что-то изменил, но не могу вспомнить, что это было. Глупый мозг. Я приму единственный опубликованный ответ и обновлю его, если выясню, в чем проблема.


person 3Dave    schedule 03.01.2011    source источник
comment
Можете ли вы попробовать сделать type="Members.Providers.MembersProvider" полностью количественно определенным, поместив сборку в конец и посмотрев, как это работает?   -  person amarsuperstar    schedule 03.01.2011
comment
Не могли бы вы развернуть и поставить сборку в конце?   -  person 3Dave    schedule 03.01.2011
comment
Отредактируйте, игнорируйте это. Ваше редактирование со следом доказывает, что загружается правильный тип   -  person amarsuperstar    schedule 03.01.2011


Ответы (2)


Еще не решение, но с помощью двух следующих функций вы можете хотя бы понять, что зарегистрировано:

Membership.Provider

Membership.Providers

По какой-то причине я унаследовал свой класс User от MembershipUser, но я уверен, что у меня была для этого веская причина :-)

person Remy    schedule 03.01.2011
comment
Да уж, удобнее было бы! Было бы неплохо, если бы существовал удобный способ копирования одного типа в другой без отражения, если у них одинаковые имена и типы свойств. Думаю, я мог бы сделать для этого шаблон Т4, но он выглядит неряшливо. - person 3Dave; 03.01.2011
comment
Принято, поскольку это единственный ответ; также я не знал о свойствах .Provider(s), которые давали некоторую полезную информацию. Спасибо. - person 3Dave; 03.01.2011
comment
Я еще немного погуглил, но, насколько я понимаю, другого способа наследования от MembershipUser нет. - person Remy; 03.01.2011
comment
Что касается копирования свойств, вы можете использовать что-то вроде AutoMapper: automapper.codeplex.com - person Matt Greer; 03.01.2011

Я использовал Membership.Provider.Name, чтобы получить правильный параметр имени

    public static MembershipUser GetUserFromEntity(this UserEntity userEntity)
    {
        return new MembershipUser(
                Membership.Provider.Name, 
                userEntity.Username,
                userEntity.PartitionKey,
                userEntity.Email,
                userEntity.PasswordQuestion,
                userEntity.Comment,
                userEntity.IsApproved,
                userEntity.IsLockedOut,
                userEntity.CreationDate,
                userEntity.LastLoginDate,
                userEntity.LastActivityDate,
                userEntity.LastPasswordChangedDate,
                userEntity.LastLockedOutDate
            );
    }
person Andrew Harry    schedule 27.06.2011
comment
Спасибо, использование Membership.Provider.Name вместо this.Name исправлено. Указанное имя поставщика членства является недопустимой ошибкой во время тестирования. Эта ошибка началась только тогда, когда я начал напрямую вызывать своего настраиваемого провайдера через созданный мной экземпляр, а не обращаться к нему через класс членства. - person Peadar Doyle; 08.03.2012