自定义角色提供程序问题

War*_*War 2 .net roleprovider

此堆栈跟踪是由于"提供程序名称不能为null或为空"的错误导致的.

[ArgumentException:提供程序名称不能为null或为空.] System.Web.Security.Roles.Initialize()+ 2230205 System.Web.Security.RoleManagerModule.OnLeave(Object source,EventArgs eventArgs)+68 System.Web.SyncEventExecutionStep.System .Web.HttpApplication.IExecutionStep.Execute()+ 148 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously)+75

本质上我正在创建我自己的自定义角色提供程序,它继承了SqlRoleProvider类,我正在成功调用初始化并确认它成功完成了我的代码中的所有内容但是.Net中的某些内容显然没有被正确地初始化为"角色"对象我不能继承是让我有些头痛......

有任何想法吗?

好的,我的解决方案是分层的,这意味着我需要通过业务对象层提供安全性......为了做到这一点,我定义了以下内容:

---编辑1 ---

我的代码:

在主要装配中:

public class C20RoleProvider : RoleProvider
{
     private C20SqlRoleDataProvider prov;

     C20RoleProvider()
     {
         // this code is actually using some reflection based on config files
         // i have simplified this to illustrate the problem im having ...
         prov = new C20SqlRoleDataProvider();
     }

     public override void Initialize(string name, NameValueCollection config)
     {
         prov.Initialize(name, config);
     }
}
Run Code Online (Sandbox Code Playgroud)

在提供者组装中:

public class C20SqlRoleDataProvider : SqlRoleProvider
{
      // code omitted
}
Run Code Online (Sandbox Code Playgroud)

此时,我希望能够通过对prov进行调用来使用基类"RoleProvider"定义的任何内容....

我省略了额外的代码,但基本上所有的方法都在类"C20RoleProvider"中的RoleProvider类中标记为abstract.

我知道它看起来有点奇怪,但我要做的是将单独的业务逻辑与提供程序中的数据获取分开,数据提供程序是任何东西(通过我的反射代码),业务逻辑类"C20RoleProvider"可以在业务框架中使用不用担心破坏任何东西并允许替换后端源(例如角色数据可以来自任何地方).

这里还有很多内容,但基本上整个应用程序框架/业务对象层以这种方式使用提供程序从任何来源向核心业务逻辑"提供"数据.

War*_*War 7

好吧,我做了一些挖掘......事实证明我没有传回那个"名字"属性,这个属性实际上并没有被引用到任何地方......

修复就像这样......

public class C20RoleProvider : RoleProvider 
{ 
     private C20SqlRoleDataProvider prov; 

     public string Name
     {
         get {return prov.Name;}
     }

     C20RoleProvider() 
     { 
         // this code is actually using some reflection based on config files 
         // i have simplified this to illustrate the problem im having ... 
         prov = new C20SqlRoleDataProvider(); 
     } 

     public override void Initialize(string name, NameValueCollection config) 
     { 
         prov.Initialize(name, config); 
     } 
} 
Run Code Online (Sandbox Code Playgroud)

奇怪的是,这似乎在网上任何地方都不知道.

  • 我在我写的另一个自定义成员资格提供程序上得到了这个.问题是,您必须将name属性传递给包装的Initialize方法,并在此方案中覆盖Name属性,以便从包装的提供程序中检索值.这个属性是虚拟的而不是抽象的,这就是为什么在我看到错误之前我没有注意到它. (2认同)