动态更改web.config中的connectionString

3

我在web.config文件中有以下内容:

<connectionStrings>
   <add name="ActiveDirectoryConnection" connectionString="LDAP://ActiveDirectoryDomain1.com" providerName="System.Web.Security.ActiveDirectoryMembershipProvider"/>
</connectionStrings>

我需要在登录页面添加一个下拉框,允许用户更改connectionString到不同的字符串,例如 "LDAP://ActiveDirectoryDomain2.com"。
在C#代码后台中,如何更改connectionString的值?
更多信息: 我的问题在于还有其他4个web.config设置调用同一个connectionString。例如:
<activeDirectorySecurityContextSettings connectionStringName="ActiveDirectoryConnection" defaultADUserName="ReportUser" defaultADPassword="password"/>  

谢谢!

4个回答

7
如果用户可以更改设置的值,则 web.config 文件不是存储该设置的正确位置。您应该查看设置文件中的用户作用域值。使用此类设置时,运行时更改值很容易。MSDN - 在 C# 中使用设置
Properties.Settings.Default.LdapConnectionString = "New Connection String";
Properties.Settings.Default.Save();

或者,如果您希望它在整个应用程序中生效(我想像应用程序管理员可能希望更改所有用户的应用程序数据库,而不是每个连接更改),那么您可以为所有连接字符串使用单例类,并从应用程序界面更改它们。然后,这些数据可以持久化到其他地方,并且仍然可以在应用程序会话之间保存。 - jcolebrand
@drachenstern - 实际上,使用设置仍然是更明智的选择。您只需要将其应用程序范围而不是用户范围即可。这比尝试实现世界不需要的另一个Singleton要容易得多。 - Justin Niessner
我遇到的问题是有4个其他的web.config设置调用了同一个connectionString。例如:<activeDirectorySecurityContextSettings connectionStringName="ActiveDirectoryConnection" defaultADUserName="ReportUser" defaultADPassword="password"/>因此,似乎我不能将其放在Settings文件中。 - user390480
谢谢,我看到我需要重新学习一下设置,我以为它是基于用户的,而不是应用程序... /再次自责! - jcolebrand

3
  • 从程序内部修改 *.config 文件是一个不好的想法。
  • 网页修改网站根目录中的任何文件都是一个不好的想法。
  • 允许网页修改网站根目录中的文件是一个不好的想法。

基本上,你需要忘记 web.config,将代码结构化以使用仅存在于内存中的连接字符串。


2
var settings = ConfigurationManager.ConnectionStrings[ 0 ];

var fi = typeof( ConfigurationElement ).GetField( "_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic );

fi.SetValue(settings, false);

settings.ConnectionString = "Data Source=Something";

0

即使从应用程序内部修改web.config文件是一个不好的想法,但您可以尝试这样做:

System.Configuration.ConfigurationManager.AppSettings.Set("keyToBeReplaced", "newKeyValue");

那并不是 OP 所要求的。 - Andrew Barber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接