这是不久前发生在我身上的事。在我的代码中,我需要获取指定用户在其中分配的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并随心所欲地使用它们。
我想知道,为什么从实例化的SqlRoleProvider中使用GetRolesForUser不起作用?因为这也可能发生在我将要处理的下一段代码中,即使用RemoveUsersFromRoles和AddUsersToRoles。另外,程序寻找的是什么类型的实例?为了让方法正常工作,我还没有实例化哪些内容?
发布于 2014-01-09 11:29:12
您调用的是new SqlRoleProvider(),但根据该构造函数http://msdn.microsoft.com/en-us/library/system.web.security.sqlroleprovider.sqlroleprovider.aspx的文档
ASP.NET调用SqlRoleProvider构造函数来创建在应用程序配置中指定的SqlRoleProvider类的实例。此构造函数不应在代码中使用。
(重点是我的。)我不是这门课的专家,但我认为这句话表明你不应该尝试这样做。
发布于 2014-01-09 12:19:16
尽管@Chris Culter的建议可能会更好地作为注释,但如果框架建议不要直接实例化对象,那么很可能你不应该这样做。这样做可能会跳过实例化对象上的几个重要初始化步骤,这意味着您可能没有很好地提供它,无法满足其预期用途。
您偶然发现了实现目标的推荐方法,那么为什么还要为不起作用的选项而烦恼呢(特别是考虑到它显然不是推荐的)?
如果以这种方式使用这个类有什么特别的收获,那么我建议将相关的程序集放到ILSpy或Reflector中,并开始深入研究框架是如何使用您的特定用例的,以确保您将行为模拟为T。
即使仍然依赖于不推荐的行为,无论它可能是多么公开,都是非常不受欢迎的,因为将来可能会在没有通知的情况下进行更改。最好依赖于类的使用方式,而不是小众的编译要求。
https://stackoverflow.com/questions/21010956
复制相似问题