SqlRoleProvider: NullReferenceException при вызове Roles.GetRolesForUser
Сценарий: служба WCF, использующая SqlRoleProvider для аутентификации на сервере базы данных Sql Server 2012. WCF размещается на веб-сервере IIS7.
пожалуйста, посмотрите эту ошибку:
System.NullReferenceException: ссылка на объект не установлена на экземпляр объекта.
в System.Web.Security.Roles.GetRolesForUser(имя пользователя в строке)
Управление ролями включено.
На моей локальной машине разработки (сервер 2012, iis7) это работает нормально. Когда я вхожу в систему и вызываю метод, роли извлекаются.
На другом сервере (тестовая среда) он не работает. Я могу войти (пользователь проходит проверку подлинности с помощью пользователя и передается в базу данных сервера SQL), но когда я пытаюсь получить роли для этого пользователя, я получаю исключение nullreference.
Как это возможно, есть ли у кого-нибудь указания, где может возникнуть эта проблема?
С наилучшими пожеланиями.
2 ответа
Поиск в Google с тегами переполнения стека при условии, что я наткнулся на этот сайт: http://www.lhotka.net/weblog/CallingRolesGetRolesForUserInAWCFService.aspx
Короче: видимо что-то сломалось между.net 3.5 и.net 4.
Чтобы решить эту проблему, позвоните:
string[] roles = Roles.Provider.GetRolesForUser(ServiceSecurityContext.Current.PrimaryIdentity.Name);
вместо
string[] roles = Roles.GetRolesForUser(ServiceSecurityContext.Current.PrimaryIdentity.Name);
Разница в .Provider
который добавлен в середине. После добавления это работало нормально.
Эта проблема звучит как ошибка asp.net.
Обходной путь - настроить уровень трассировки вашего веб-сервера. Например, добавление следующих настроек в файл web.config решит проблему,
<system.webServer>
<tracing>
<traceFailedRequests>
<remove path="*"/>
<add path="*">
<traceAreas>
<add provider="ASP" verbosity="Verbose" />
<!-- Note that the verbosity is set to Warning (default value is Verbose)-->
<add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Warning" />
<add provider="ISAPI Extension" verbosity="Verbose" />
<add provider="WWW Server" areas="Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,Rewrite,WebSocket" verbosity="Verbose" />
</traceAreas>
<failureDefinitions statusCodes="200-999" />
</add>
</traceFailedRequests>
</tracing>
</system.webServer>