2010-09-21 24 views
3

我正在創建一個自定義SqlMembershipProvider類,以將一些增強功能添加到基類。儘管如此,我正在處理連接字符串。我如何從配置中讀取連接字符串名稱,並將其提供給其餘的方法?定製ASP.NET SqlMembershipProvider - 處理連接字符串

現在我有:

public override void Initialize(string name, NameValueCollection config) 
     { 
      base.Initialize(name, config); 

      _ConnectionStringName = config["connectionStringName"]; 
     } 

但在其他方法中,_ConnectionStringName變量爲空:

SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings[_ConnectionStringName].ConnectionString) 

什麼是存儲連接字符串名稱,因此可用於全球範圍的正確方法在我的自定義會員供應商?

謝謝!

回答

2

ProviderBase將拋出一個ConfigurationException是否存在由當時的配置集合中留下的任何條目得到它就是這麼每個供應商刪除它調用base.Initialize之前的配置項。

這個問題,你發現作爲this answer的結果是你必須在致電base.Initialize之前得到你的值。

對不起,我乍一看錯過了。


這篇文章的其餘部分是歷史和上面所列舉而技術上是正確的失誤在這裏突出的問題。

第一次嘗試WebConfigurationManager.ConnectionStrings

WebConfigurationManager處理從您的windows \ microsoft.net \ framework \ 2.0xxxx \ web.config一路應用web.config的層次結構一直到您的應用程序。

此行爲不存在於ConfigurationManager中,該行爲通常將machine.config處理爲app.config。


如果這不能解決你的問題,你必須在其他地方在你的代碼被覆蓋的值,如果確實_ConnectionStringNameInitialize被正確分配。

首先,設置一個斷點並確保_ConnectionStringName按預期設置。

然後找到對該字段的所有引用並確保您沒有錯誤。

這是假設,當然,_ConnectionStringName是一個私人領域。如果不是這樣,那麼編譯出錯。

+0

我知道如何從web.config中檢索連接字符串。我的具體問題是關於從Initialize中檢索連接字符串名稱屬性,並將其用於我的其餘方法。我設置斷點和_ConnectionStringName設置正確,但它是空的,我的時候我用另一種方法調用它。 – 2010-09-23 14:15:12

+0

@mike - 那麼你要麼引用一個不同的成員,要麼該成員被覆蓋。有了這些信息,就沒有其他可能的解釋。 – 2010-09-23 18:21:55

+0

我會進一步深入檢查。我也很困惑,並認爲有一個我不知道的地方。 – 2010-09-23 20:45:32

2

不知道這是否有幫助,但是我需要重寫SqlMembershipProvider的子類中的connectionstring類似的問題。

這種想法不是我自己 - 我發現它在這個論壇上發帖的評論部分: http://forums.asp.net/p/997608/2209437.aspx

public override void Initialize(string name, NameValueCollection config) 
{ 
    base.Initialize(name, config);<br> 
    string connectionString = //...what you want your connection string to be, 
           //so config["connectionStringName"]... 
    // Set private property of Membership provider. 
    System.Reflection.FieldInfo connectionStringField = 
     GetType().BaseType.GetField("_sqlConnectionString", 
     System.Reflection.BindingFlags.Instance 
     | System.Reflection.BindingFlags.NonPublic); 

    connectionStringField.SetValue(this, connectionString); 
} 

我道歉 - 我以前從來沒有張貼在這裏,這樣的格式也可能分比肩!

+0

感謝您的評論。但是,我不認爲發佈的代碼會起作用。它似乎base.Initialize方法清除配置值。這是我遇到的原始問題。 – 2010-09-27 13:54:00

1

這可能是6個月來不及幫忙,但我能得到連接字符串是這樣的:

using System.Web.Configuration; 

Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); 
MembershipSection section = config.SectionGroups["system.web"].Sections["membership"] as MembershipSection; 
string defaultProvider = section.DefaultProvider; 
string connstringName = section.Providers[defaultProvider].ElementInformation.Properties["connectionStringName"].Value.ToString(); 
string val = config.ConnectionStrings.ConnectionStrings[connstringName].ConnectionString; 

這使得默認提供者的連接字符串屬性的假設 - 但如果你'繼承SqlMembershipProvider然後應該總是有一個,在web.config鏈的某個地方(它在machine.config中定義,我相信)。

所有這一切,添加一個方法到change the username