20

有没有一种方法可以在 Asp.Net 应用程序中将连接字符串添加到 ConfigurationManager 在运行时返回的 ConnectionStringCollection 中?

我尝试了以下方法,但被告知配置文件是只读的。

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

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

谢谢

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

4

8 回答 8

35

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

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

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

于 2011-12-13T18:29:41.697 回答
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

于 2008-12-10T20:49:54.487 回答
10

只是指出谁给了你不能将连接字符串放在 web.config 中的“安全要求”是一个白痴。除了您的应用程序或对服务器的远程访问之外,任何东西都不能访问 web.config。

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

于 2008-12-10T21:01:28.567 回答
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 之类的东西。

于 2008-12-10T20:47:32.197 回答
2

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

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

也许您可以执行以下操作:

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

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

<add name="myconnection" connectionString="SET AT RUNTIME" ... />
于 2008-12-10T20:56:39.590 回答
1

配置基础结构通过 Windows DataProtection API 支持非常强大的加密,该 API 使用机器特定的密钥来加密配置部分。这样,除了在加密的机器上,不可能在任何地方读取加密数据。

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

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

aspnet_regiis -pe "connectionStrings" -app "/MyCoolWebApplication" -prov "DataProtectionConfigurationProvider"
于 2008-12-11T01:54:28.957 回答
1

如果您使用的是 MS SQL,您可以将 Web 服务器配置为通过 Windows 身份验证访问 SQL Server,因此您无需在 webconfig 中设置任何密码,甚至无需在应用程序内存中使用任何密码。

于 2008-12-11T02:00:53.047 回答
-1

不,您不能在运行时修改配置文件,它不是为此而设计的。也许您可以使用 Enterprise Libraries Configuration 来做到这一点。

于 2008-12-10T20:31:31.730 回答