2010-12-10 73 views
2

此堆棧跟蹤來作爲讀取「提供者名稱不能爲空值或空白 」。問題的自定義角色提供

錯誤的結果[ArgumentException的:提供程序名稱不能爲空值或空白] 系統。 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 
} 

在這一點上,我希望能夠使用基類「RoleProvider」通過在prov上調用來定義的任何內容。 ...

我已經省略了額外的代碼,但基本上所有的方法都標記爲類「C20RoleProvider」中的RoleProvider類的抽象。

我知道它看起來有點奇怪,但我想要做的是將業務邏輯與提供者中的數據獲取分開,數據提供者是任何事物(通過我的反射代碼)可以使用業務邏輯類「C20RoleProvider」在業務框架中,不用擔心破壞任何東西,並允許更換後端資源(例如角色數據可以來自任何地方)。

在這裏還有很多事情要做,但實質上整個應用程序框架/業務對象層都以這種方式使用提供程序從任何來源向核心業務邏輯「提供」數據。

+0

你的代碼在哪裏? – willvv 2010-12-10 10:07:02

+0

添加,對不起wilvv :)還有很多,但我不想通過添加不是問題的東西使我的問題複雜化。 – War 2010-12-10 12:14:49

回答

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); 
    } 
} 

奇怪的是,這似乎並不知道在網上的任何地方。

+2

我在一封自定義會員提供程序上收到了我編寫的另一個包裹。問題是,您必須將name屬性傳遞給包裝的Initialize方法,並在此方案中重寫Name屬性,以便從包裝提供程序中檢索值。這個屬性是虛擬的而不是抽象的,這就是爲什麼我沒有注意到它,直到我看到錯誤。 – 2012-08-22 16:54:10

相關問題