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

Jam*_*ers 19 c# asp.net connection-string web-config

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

我尝试了以下但是被告知配置文件是只读的.

ConfigurationManager.ConnectionStrings.Add(new ConnectionStringSettings(params));
Run Code Online (Sandbox Code Playgroud)

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

谢谢

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

use*_*430 29

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

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

这类似于修改现有连接字符串所需的技术,并由Brian Rodgers作为评论添加.

  • 谢谢!这非常适合单元测试 (3认同)
  • 我也将其用于单元测试!非常感谢! (2认同)

Jos*_*rke 11

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

cfg.Save();
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*sic 10

只是想指出谁给你的"安全需求",你不能把在web.config中的连接字符串是个白痴.除了您的应用程序或远程访问服务器之外,Web.config永远不会被其他任何东西访问.

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

  • 嗯,如果他们已经破坏了那个盒子,他们会很快找到你的SQL服务器......你必须以某种形式在服务器上拥有连接字符串...这是一个愚蠢的要求 (3认同)
  • 我感到很痛苦,但ASP.NET用户的凭据需要有权使用您的代码用于获取连接字符串的任何方法.因此,即使您的自定义代码从远程服务器或通过某些Web服务获取连接字符串,黑客也可以使用相同的方法. (2认同)

jos*_*rry 5

如果您尝试在运行时编辑 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]; 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

或者你总是可以更重一些并使用诸如企业库配置块之类的东西。