方案: 使用SqlRoleProvider进行Sql Server 2012数据库服务器身份验证的WCF服务。 WCF托管在IIS7网络服务器上。
请看这个错误:
System.NullReferenceException:未将对象引用设置为对象的实例 在System.Web.Security.Roles.GetRolesForUser(String username)
已启用RoleManagement。
在我的本地开发机器(服务器2012,iis7)上,这很好用。当我登录并调用该方法时,将检索角色。
在另一台服务器(测试环境)上,它无法正常工作。我可以登录(用户通过用户身份验证并传递给sql server数据库)但是当我尝试检索该用户的角色时,我得到一个nullreferenceexception。
这怎么可能,是否有任何人可以找到可能出现此问题的方法?
最好的问候。
答案 0 :(得分:14)
使用标签搜索Stack Overflow,我遇到了这个网站: 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
。添加后,它工作正常。
答案 1 :(得分:1)
这个问题听起来像这个asp.net错误。
解决方法是调整Web服务器跟踪级别。例如,在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>