SqlRoleProvider.GetRolesForUser混淆:'对象引用未设置为对象的实例'

时间:2014-01-09 03:07:31

标签: c# asp.net nullreferenceexception roles sqlroleprovider

这刚刚发生在我身上。在我的代码中,我需要获取指定用户的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并按我的意愿使用它们。

我想知道,为什么使用来自instatiated GetRolesForUser的{​​{1}}不起作用?因为这可能会发生在我将要处理的下一部分代码中,即使用SqlRoleProviderRemoveUsersFromRoles。而且,该程序正在寻找什么样的实例?我没有实例化该方法的工作原理是什么?

2 个答案:

答案 0 :(得分:1)

您正在调用new SqlRoleProvider(),但根据该构造函数的文档,http://msdn.microsoft.com/en-us/library/system.web.security.sqlroleprovider.sqlroleprovider.aspx

  

ASP.NET调用SqlRoleProvider构造函数来创建应用程序配置中指定的SqlRoleProvider类的实例。 此构造函数不适用于您的代码。

(强调我的。)我不是这门课的专家,但我认为这句话表明你不应该试着这样做。

答案 1 :(得分:1)

尽管@Chris Culter的建议可能更适合作为评论,但如果框架建议不直接实例化对象,那么很可能不应该这样做。这样做可能会在实例化对象上跳过几个重要的初始化步骤,这意味着您可能无法为其预期的使用提供足够的初始化步骤。

你偶然发现了推荐的做事方式,所以为什么还要选择那些不起作用的选项(特别是考虑到明确不推荐)?

如果您通过这种方式使用此类获得了特别的东西,那么我建议将相关的程序集拉入ILSpy或Reflector并开始挖掘您的特定用例的使用方法通过框架确保您将行为模仿为T。

即使仍然依赖于未经推荐的行为,无论公开程度如何,都非常气馁,因为将来可能会在没有通知的情况下进行更改。最好依赖于应该如何使用类而不是小众编译要求。

相关问题