SqlRoleProvider.GetRolesForUser путаница: "Ссылка на объект не установлена ​​для экземпляра объекта"

Это случилось со мной некоторое время назад. В моем коде мне нужно получить Roles что указанный пользователь назначен в.

вот что в моем коде:

string[] roles = {};
SqlRoleProvider fxSRP = new SqlRoleProvider();

string id = Request.QueryString["UserName"] as string;

string userName = id;

Теперь все это хорошо, но когда я доберусь до этого немного:

roles = fxSRP.GetRolesForUser(userName);

Система бросает этот богом забытый Object reference not set to an instance of an object исключение. Честно говоря, сводил меня с ума на несколько минут. но когда я изменяю этот небольшой кусочек кода на этот (это явный вызов, верно?):

roles = Roles.GetRolesForUser(userName);

Код работает. Я могу вернуть Roles для пользователя и использовать их, как я хочу.

Я хочу знать, почему это с использованием GetRolesForUser от навязанного SqlRoleProvider не работает? Потому что это может также произойти для следующего фрагмента кода, над которым я буду работать, который должен использовать RemoveUsersFromRoles а также AddUsersToRoles, А также, какой экземпляр ищет программа? Что я не создал для метода для работы?

2 ответа

Хотя предложение @Chris Culter, скорее всего, лучше послужит комментарием, как есть, есть хороший шанс, что если среда рекомендует не создавать экземпляр объекта напрямую, вам, вероятно, не следует. Это может привести к пропуску нескольких важных этапов инициализации экземпляра объекта, что означает, что вы, вероятно, не предоставили его достаточно хорошо для его ожидаемого использования.

Вы наткнулись на рекомендуемый способ делать то, что вам нужно, так зачем беспокоиться о том, что опция не работает (особенно если учесть, что она явно не рекомендуется)?

Если вы определенно что-то получаете от использования этого класса, то я бы порекомендовал перенести соответствующую сборку в ILSpy или Reflector и начать копаться в том, как ваш конкретный вариант использования используется платформой, чтобы убедиться, что вы подражаете поведению Т.

Даже по-прежнему в зависимости от нерекомендованного поведения, независимо от того, насколько публичным оно может быть, крайне не рекомендуется, так как это можно изменить в будущем без уведомления. Лучше зависеть от того, как должны использоваться классы, а не от требований компиляции ниши.

Ты звонишь new SqlRoleProvider(), но в соответствии с документацией для этого конструктора, http://msdn.microsoft.com/en-us/library/system.web.security.sqlroleprovider.sqlroleprovider.aspx:

ASP.NET вызывает конструктор SqlRoleProvider для создания экземпляра класса SqlRoleProvider, как указано в конфигурации для приложения. Этот конструктор не предназначен для использования в вашем коде.

(Акцент мой.) Я не эксперт в этом классе, но я думаю, что это замечание указывает на то, что вы не должны пытаться это делать.

Другие вопросы по тегам