2011-01-03 1 views
3

Я реализую пользовательский поставщик членства, и все кажется плавным, пока я не создаю объект MembershipUser. В этот момент, я получаю сообщение об ошибке:ASP.NET MVC3 Пользовательский поставщик членства - указанное имя поставщика членства недействительно

The membership provider name specified is invalid. Parameter name: 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; 
    } 

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

У меня такое ощущение, что параметр new MembershipUser(...) ProviderName должен соответствовать тому, что это установлено в web.config, но, так как они совпадают уже, я в недоумении, как действовать.

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

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

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

Update Вот содержимое 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 . 

Update 2

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

+0

вы можете попытаться сделать 'тип =«Members.Providers.MembersProvider»' полностью кванти связанный с установкой сборки в конце и посмотреть, как это работает – amarsuperstar

+0

Не могли бы вы расширить «поставить сборку в конце»? –

+0

Редактировать, игнорировать это. Ваше редактирование со следом доказывает, что загружает правильный тип – amarsuperstar

ответ

3

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

Membership.Provider 

Membership.Providers 

Я унаследовать свой класс пользователя из MembershipUser по какой-то причине, но я довольно уверен, что у меня была хорошая причина для этого :-)

+0

Да, это было бы, конечно, более удобно! Было бы неплохо, если бы был удобный, нереляционный способ копирования одного типа в другой, если они имеют одинаковые имена и типы свойств. Думаю, я мог бы создать для этого шаблон T4, но он чувствует себя неряшливым. –

+0

Принимается, так как это единственный ответ; также я не знал о свойствах '.Provider (s)', которые предоставили некоторую полезную информацию. Благодарю. –

+0

Я сделал еще несколько поисковых запросов, но, насколько я вижу, нет другого способа наследовать от MembershipUser. – Remy

6

Я использовал 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 
      ); 
    } 
+0

Спасибо, используя членство.Provider.Name, в отличие от этого. Имя исправлено: ошибка «Имя поставщика членства указано неверно» во время тестирования. Эта ошибка началась только после того, как я начал напрямую обращаться к своему пользовательскому провайдеру через экземпляр, который я создал, а не к нему через класс Membership. –

+0

Это сделало это! благодаря –

 Смежные вопросы

  • Нет связанных вопросов^_^