2008-12-10 69 views
16

有沒有一種方法可以將連接字符串添加到ConfigurationManager在運行時在Asp.Net應用程序中返回的ConnectionStringCollection?我可以在運行時將ConnectionStrings添加到ConnectionStringCollection嗎?

我試過以下,但被告知配置文件是隻讀的。

ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params)); 

是否有另一種方法可以在運行時執行此操作?我知道在設計時我可以添加一個連接字符串到web.config;不過,我希望在運行時爲該集合添加一些內容。

感謝

編輯: 一個爲什麼我試圖做到這一點的原因是由於防止我把的ConnectionStrings在web.config安全要求(甚至是加密的)。我想在我的項目中使用Membership和Profiles等元素;然而,我正在尋找一種替代方式來做這樣的W/O寫一個自定義提供商。自定義提供程序並不是那麼糟糕,但如果我能找到一個更簡單的解決方案,我完全贊成。

+0

您可以將連接字符串移出web.config。請參閱將密碼和其他敏感數據部署到ASP.NET和Azure網站的最佳實踐http://www.asp.net/identity/overview/features-api/best-practices-for-deploying-passwords-and-other-sensitive -data-to-aspnet-and-azure – RickAndMSFT 2015-03-17 03:36:23

回答

0

不,您不能在運行時修改配置文件,它不適用於此目的。 也許您可以使用Enterprise Libraries Configuration來完成此操作。

+0

-1這根本不是真的,它只是讓你的網站回收。 – 2015-03-17 14:28:40

+0

Ohh..come on !!當然,你可以它是一個XML文件,但是這是一個非常糟糕的做法。 .NET沒有修改配置文件的API ....問自己爲什麼。 「 - ) – ema 2015-03-18 09:38:40

+0

再次不正確,它絕對具有用於修改配置文件`OpenWebConfiguration/Save`的API http://stackoverflow.com/a/719941/37055 – 2015-03-18 20:21:05

4

如果您試圖在運行時編輯web.config中的連接字符串,請查看WebConfigurationManager

如果您只是想在運行時修改配置以注入連接字符串,那麼您運氣不好。 ConfigurationManager對象樹意味着可以直接反映配置文件,如果您能夠更改狀態則不一致。

我會建議創建一個簡單的外觀類,您可以使用它來檢索您的連接字符串。通過這種方式,您可以讓Facade從您的即時集合中返回一個連接字符串,或者如果其中一個不存在,那麼它可以從ConfigurationManager中獲取它。

class ConnectionStringProvider 
{ 
    Dictionary<string, System.Configuration.ConnectionStringSettings> _localStrings = new Dictionary<string, System.Configuration.ConnectionStringSettings>(); 

    public void AddLocalConnectionString(string name, string connstring) 
    { 
     System.Configuration.ConnectionStringSettings cs = new System.Configuration.ConnectionStringSettings(name, connstring); 
     _localStrings.Add(name, cs); 
    } 

    public void RemoveLocalConnectionString(string name) 
    { 
     _localStrings.Remove(name); 
    } 

    public System.Configuration.ConnectionStringSettings this[string name] { 
     get 
     { 
      return _localStrings.ContainsKey(name) ? _localStrings[name] : System.Configuration.ConfigurationManager.ConnectionStrings[name]; 
     } 
    } 
} 

或者你總是可以很有點重,並使用類似Enterprise Library配置塊。

1

還沒有嘗試過,但也許你可以在運行時改變現有的連接字符串的值?例如,而不是:

ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params)); 

也許你可以這樣做:

ConfigurationManager.ConnectionStrings["myconnection"].ConnectionString = "something"; 

如果是這樣,你可以指定在配置連接字符串「變量」,而是將它們設置爲false或空連接字符串:

<add name="myconnection" connectionString="SET AT RUNTIME" ... /> 
11

只是指出誰給了你的「安全要求」,你不能把連接字符串放在web.config中是一個白癡。除了應用程序或遠程訪問服務器之外,web.config永遠不能被任何其他訪問。

這聽起來完全像是一個需求問題,應該在那裏解決。

1

配置基礎架構支持通過Windows DataProtection API進行非常健壯的加密,這使用計算機專用密鑰來加密配置部分。這樣就不可能在加密的機器上的任何地方讀取加密的數據。

這是在Windows中用於政府兼容驅動器/文件夾加密的相同API。這會否抵擋你公司的安全要求?

無論是手動或通過您的部署自動化,您可以執行此命令來加密web.config的connectionStrings部分爲特定的Web應用程序。

aspnet_regiis -pe "connectionStrings" -app "/MyCoolWebApplication" -prov "DataProtectionConfigurationProvider" 
1

如果您正在使用MS SQL,你可以配置你的Web服務器訪問通過Windows身份驗證的SQL Server,所以你永遠都在你的webconfig,甚至在應用程序中漂浮有任何密碼記憶。

20

您可以使用反射來禁止私人bReadOnly場(壞主意等):

typeof(ConfigurationElementCollection) 
    .GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic) 
    .SetValue(ConfigurationManager.ConnectionStrings, false); 
ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings()); 

這類似於要求modify an existing connection string的技術,並加入由布賴恩·羅傑斯評論那裏。

相關問題