如何编辑外部web.config文件?(How to edit an external web.co

2019-07-01 15:49发布

我试图写一个WinForm应用程序,将能够编辑已安装的Web应用程序的web.config文件。 我已经通过ConfigurationManager中和WebConfigurationManager类的方法读,但我不能确定,我怎么能打开Web应用程序的配置文件,并对其进行编辑。

我找的,不需要我来加载配置文件作为常规的XmlDocument的方法,但我愿意这样做,如果这是唯一的选择。

任何意见,将不胜感激。

Answer 1:

好了,所以这里的答案,我有完全相同的情况。 我想写一个WinForms应用程序,允许普通用户来更新web.config文件。 你必须去获得的配置一个愚蠢的方式......

// the key of the setting
string key = "MyKey";

// the new value you want to change the setting to
string value = "This is my New Value!";

// the path to the web.config
string path = @"C:\web.config";

// open your web.config, so far this is the ONLY way i've found to do this without it wanting a virtual directory or some nonsense
// even "OpenExeConfiguration" will not work
var config = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap() { ExeConfigFilename = path }, ConfigurationUserLevel.None);

// now that we have our config, grab the element out of the settings
var element = config.AppSettings.Settings[key];

// it may be null if its not there already
if (element == null)
{
 // we'll handle it not being there by adding it with the new value
 config.AppSettings.Settings.Add(key, value);
}
else
{
 // note: if you wanted to you could inspect the current value via element.Value

 // in this case, its already present, just update the value
 element.Value = value;
}

// save the config, minimal is key here if you dont want huge web.config bloat
config.Save(ConfigurationSaveMode.Minimal, true);

这里是做什么的一个例子

之前:

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="MyKey" value="OldValue" />
  </appSettings>
  <connectionStrings>
    <add name="myConnString" connectionString="blah blah blah" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

后:

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="MyKey" value="This is my New Value!" />
  </appSettings>
  <connectionStrings>
    <add name="myConnString" connectionString="blah blah blah" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <system.web>
    <trust level="Full" />
    <webControls clientScriptsLocation="/aspnet_client/{0}/{1}/" />
  </system.web>
</configuration>

只是要小心,如果你给它一个无效的路径,它只是在创建该路径/文件名的配置文件。 基本上,做一个File.Exists检查其第一

顺便说一句,而你在它,你可以写,它表示你的web.config设置的类。 一旦你这样做,写你的getter / setter方法读/写在web.config中的设置。 一旦做到这一点,你可以添加这个类作为数据源并拖动数据绑定控件到您的WinForm。 这会给你一个完全的数据绑定WinForm的web.config文件编辑器,你可以很容易地在几分钟之内就敲定。 我有在那我会后,明天工作的例子。

功能齐全的WinForms解决方案

因此,这是一个相对简单的解决方案,编写GUI来编辑web.config中,有些人可能会说,它过于复杂时,记事本会做得很好,但它为我的作品和我的观众。

它的工作原理基本上如上所述,我写了一个类,有,我想作为属性的配置点。 该ctor打开从路径和干将文件/ setter方法拉出来的数据返回的配置对象,最后它有把它写到一个保存方法。 有了这个类,我能够将该类添加为数据源和拖/放绑定控件上的WinForms。 从那里,你所要做的就是连接了一个按钮,调用保存方法的类。

配置类

using System.Configuration;

// This is a representation of our web.config, we can change the properties and call save to save them
public class WebConfigSettings
{
 // This holds our configuration element so we dont have to reopen the file constantly
 private Configuration config;

 // given a path to a web.config, this ctor will init the class and open the config file so it can map the getters / setters to the values in the config
 public WebConfigSettings(string path)
 {
  // open the config via a method that we wrote, since we'll be opening it in more than 1 location
  this.config = this.OpenConfig(path);
 }

 // Read/Write property that maps to a web.config setting
 public string MySetting
 {
  get { return this.Get("MySetting"); }
  set { this.Set("MySetting", value); }
 }

 // Read/Write property that maps to a web.config setting
 public string MySetting2
 {
  get { return this.Get("MySetting2"); }
  set { this.Set("MySetting2", value); }
 }

 // helper method to get the value of a given key
 private string Get(string key)
 { 
  var element = config.AppSettings.Settings[key];

  // it may be null if its not there already
  if (element == null)
  {
   // we'll handle it not being there by adding it with the new value
   config.AppSettings.Settings.Add(key, "");

   // pull the element again so we can set it below
   element = config.AppSettings.Settings[key];
  }
  return element.Value;
 }

 // helper method to set the value of a given key
 private void Set(string key, string value)
 {
  // now that we have our config, grab the element out of the settings
  var element = this.config.AppSettings.Settings[key];

  // it may be null if its not there already
  if (element == null)
  {
   // we'll handle it not being there by adding it with the new value
   config.AppSettings.Settings.Add(key, value);
  }
  else
  {
   // in this case, its already present, just update the value
   element.Value = value;
  }
 }

 // Writes all the values to the config file
 public void Save()
 {
  // save the config, minimal is key here if you dont want huge web.config bloat
  this.config.Save(ConfigurationSaveMode.Minimal, true);
 }

 public void SaveAs(string newPath)
 {
  this.config.SaveAs(path, ConfigurationSaveMode.Minimal, true);

  // due to some weird .net issue, you have to null the config out after you SaveAs it because next time you try to save, it will error
  this.config = null;
  this.config = this.OpenConfig(newPath);
 }

 // where the magic happens, we'll open the config here     
 protected Configuration OpenConfig(string path)
 {
  return ConfigurationManager.OpenMappedExeConfiguration(
        new ExeConfigurationFileMap() {  ExeConfigFilename = path }, 
        ConfigurationUserLevel.None);   
 }
}

生成,然后从那里你可以直接跳转到你WinForm设计,转到数据>显示数据源(按住Shift + Alt + d)。 右键点击>添加新数据源,并将其添加为对象,如图

的2个数据源配置向导1 http://img109.imageshack.us/img109/8268/98868932.png

2数据源配置向导2 http://img714.imageshack.us/img714/7287/91962513.png

它(WebConfigSettings,最上面的)拖到WinForm的。 就我而言,我会删除导航,因为这是一个名单,我只是有一个。

新加入的数据绑定控件http://img96.imageshack.us/img96/8268/29648681.png

你应该有类似webConfigSettingsBindingSource在设计师(在下一PIC所示)的底部。 转到代码视图和更改ctor这个

public Form1()
{
    InitializeComponent();

    // wire up the actual source of data
    this.webConfigSettingsBindingSource.DataSource = new WebConfigSettings(@"c:\web.config");
}

添加一个保存按钮,以您的WinForm

保存按钮添加http://img402.imageshack.us/img402/8634/73975062.png

添加下面的事件处理程序

private void saveButton_Click(object sender, EventArgs e)
{
    // get our WebConfigSettings object out of the datasource to do some save'n
    var settings = (WebConfigSettings)this.webConfigSettingsBindingSource.DataSource;

    // call save, this will write the changes to the file via the ConfigurationManager
    settings.Save();
}

在那里,现在你有一个很好的简单数据绑定的web.config文件编辑器。 要添加/删除字段,你只需要修改你的WebConfigSettings类,刷新数据源窗口的数据源(构建后),然后拖动ñ下降的新领域到UI。

你仍然不得不线了一些代码,指定web.config中打开,在这个例子中我只是硬编码的路径。

这里的很酷的事情是所有的GUI添加值。 您可以轻松地添加目录或filebrowser对话框,您可以连接字符串测试仪等,所有都非常容易被添加的功能非常强大,以最终用户。



Answer 2:

我强烈建议你使用XElement随着LINQ启用(LINQ到XML)。

比如你想改变connectionString 。 这种类型的代码是不够好

var connString = from c in webConfigXElement.appSettings.connectionString
                        where c.name == "myConnection"
                        select c;

现在你在完全控制<connectionString />元素,你想用它做什么。

我是指你MSDN学习,也是一个脚启动即时工作。

希望这可以帮助你有在你完全控制.xml无疼痛。



Answer 3:

在这里,你走了,我写了一个玩具应用程序(VB.NET的Windows客户端)编辑使用树/网格进行浏览和编辑XML文件。

你可能会从中得到一些想法。 它的VS项目文件是在这里或只是一个MSI安装它是在这里 ,如果你想尝试一下在你的web.config。

它的文件加载到数据集(DataSet.ReadXML()),其将其解析为数据表,然后显示并允许的内容编辑在一个标准的数据网格。 然后,它会保存编辑的内容返回到XML文件(DataSet.WriteXML())。



Answer 4:

所有app.configweb.config只是XML文件。 您可以打开和使用的XMLDocument以外,XMLWriter等编辑



文章来源: How to edit an external web.config file?