我可以在运行时将ConnectionStrings添加到ConnectionStringCollection吗?

时间:2008-12-10 20:19:48

标签: c# asp.net web-config connection-string

有没有办法在Asp.Net应用程序中在运行时向ConfigurationManager返回的ConnectionStringCollection添加连接字符串?

我尝试过以下操作,但我被告知配置文件是只读的。

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

还有其他方法可以在运行时执行此操作吗?我知道在设计时我可以在web.config中添加连接字符串;但是,我希望在运行时向该集合添加一些内容。

由于

编辑: 我试图这样做的原因之一是由于安全要求阻止我将ConnectionStrings放在web.config中(甚至加密)。我想在我的项目中使用会员和个人资料等元素;但是,我正在寻找一种替代方法来做这样的,而不是编写自定义提供程序。自定义提供商并不是那么糟糕,但如果我能找到一个更简单的解决方案,我就全力以赴。

8 个答案:

答案 0 :(得分:25)

你可以使用反射来禁用私人bReadOnly字段(坏主意等):

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

这类似于modify an existing connection string所需的技术,并由Brian Rodgers作为评论添加。

答案 1 :(得分:11)

var cfg = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(@"/");
cfg.ConnectionStrings.ConnectionStrings.Add(new ConnectionStringSettings(params));

cfg.Save();

建议这将导致您的网站回收,因为它修改了配置文件。查看http://msdn.microsoft.com/en-us/library/4c2kcht0(VS.80).aspx

答案 2 :(得分:10)

只是要指出谁给你“安全要求”,你不能把连接字符串放在web.config是一个白痴。除了您的应用程序或远程访问服务器之外,Web.config永远不会被访问。

这听起来完全像需求问题,应该在那里解决。

答案 3 :(得分:4)

如果您在运行时尝试编辑web.config中的连接字符串,请查看WebConfigurationManager

如果您只是尝试在运行时修改配置以注入连接字符串,那么您就不走运了。如果您能够更改状态将不一致,ConfigurationManager对象树将直接反映配置文件。

我建议您创建一个可用于检索连接字符串的简单外观类。通过这种方式,您可以让外观从您的即时集合返回一个连接字符串,或者如果一个不存在,那么它可以从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 Configuration Block这样的东西。

答案 4 :(得分:1)

尚未尝试过,但也许您可以在运行时更改现有连接字符串的值?例如,而不是:

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

也许你可以这样做:

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

如果是这样,您可以在config中指定连接字符串“variables”,但将它们设置为false或空连接字符串:

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

答案 5 :(得分:1)

配置基础架构通过Windows DataProtection API支持非常强大的加密,它使用特定于机器的密钥来加密配置节。这样就不可能在任何地方读取加密数据,而是在加密数据的机器上读取。

这与用于Windows中符合政府标准的驱动器/文件夹加密的API相同。这是否符合您公司的安全要求?

您可以手动或通过部署自动化执行此命令来加密特定Web应用程序的web.config的connectionStrings部分。

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

答案 6 :(得分:1)

如果您使用的是MS SQL,则可以将Web服务器配置为通过Windows身份验证访问SQL Server,这样您就不必在Webconfig中拥有任何密码,甚至可以在应用程序内存中浮动。

答案 7 :(得分:0)

不,您无法在运行时修改配置文件,也不适用于此。 也许你可以使用企业库配置来做到这一点。