2008-12-10 117 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的技术,并加入由布赖恩·罗杰斯评论那里。

相关问题