自定义角色提供程序问题

时间:2010-12-10 10:01:16

标签: .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);
     }
}

在提供者程序集中:

public class C20SqlRoleDataProvider : SqlRoleProvider
{
      // code omitted
}

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

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

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

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

1 个答案:

答案 0 :(得分: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); 
     } 
} 

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