Как редактировать внешний файл web.config? - PullRequest
6 голосов
/ 19 августа 2009

Я пытаюсь написать приложение winform, которое сможет редактировать файл web.config установленного веб-приложения. Я прочитал методы класса ConfigurationManager и WebConfigurationManager, но не уверен, как открыть файл конфигурации веб-приложения и отредактировать его.

Я ищу метод, который не требует, чтобы я загружал файл конфигурации как обычный XmlDocument, хотя я готов сделать это, если это единственный доступный вариант.

Любой совет будет оценен.

Ответы [ 4 ]

7 голосов
/ 10 февраля 2010

Хорошо, так вот ответ, у меня точно такой же сценарий. Я хотел написать приложение 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. Как только вы это сделаете, напишите свои методы получения / установки для чтения / записи настроек в файле web.config. Когда ЭТО выполнено, вы можете добавить этот класс в качестве источника данных и перетащить элементы управления, связанные с данными, в свою win-форму. Это даст вам полностью отформатированный winform web.config редактор, который вы можете легко создать за считанные минуты. У меня есть пример на работе, который я опубликую завтра.

Полнофункциональное решение Winforms

Так что это относительно простое решение для написания графического интерфейса для редактирования web.config, некоторые могут сказать, что это слишком сложно, когда блокнот будет работать нормально, но он работает для меня и моей аудитории.

В основном это работает, как описано выше, я написал класс, у которого были точки конфигурации, которые я хотел в качестве свойств. ctor открывает файл по пути, и получатели / установщики извлекают данные из возвращенного объекта конфигурации, наконец, у него есть метод сохранения, который записывает их. С помощью этого класса я могу добавить класс в качестве источника данных и перетаскивать связанные элементы управления на winforms. Оттуда все, что вам нужно сделать, это подключить кнопку, которая вызывает метод save вашего класса.

Класс конфигурации

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). Щелкните правой кнопкой мыши> Добавить новый источник данных и добавьте его как объект, как показано

Мастер настройки источника данных 1 из 2 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 внизу конструктора (показано на следующем рисунке). Перейти к представлению кода и изменить 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, обновите источник данных в окне Источники данных (после сборки), а затем перетащите n, перетащив новые поля в пользовательский интерфейс.

Вам все равно придется подключить некоторый код, который определяет открываемый web.config, для этого примера я просто жестко закодировал путь.

Крутая вещь - это вся ценность, которую добавляет GUI. Вы можете легко добавлять диалоговые окна каталога или файлового браузера, у вас могут быть тестеры строк подключения и т. Д. Все они очень просты в добавлении и очень эффективны для конечного пользователя.

1 голос
/ 10 февраля 2010

Я настоятельно рекомендую вам использовать XElement вместе с включенным LINQ (LINQ to XML).

Например, вы хотите изменить connectionString. Этот тип кода достаточно хорош

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

и теперь у вас есть полный контроль над элементом <connectionString />, и вы можете делать с ним все, что хотите.

Я рекомендую вам MSDN для обучения, а также Kick Start для мгновенной работы.

Надеюсь, это поможет вам полностью контролировать свой .xml без боли.

0 голосов
/ 11 февраля 2010

Итак, я написал игрушечное приложение (клиент VB.NET для Windows), которое редактирует XML-файлы, используя Tree / Grid для навигации и редактирования.

Вы можете получить некоторые идеи из этого. Файл проекта VS для него здесь или просто MSI для его установки здесь , если вы хотите попробовать его на своем web.config.

Загружает файл в DataSet (DataSet.ReadXML ()), который анализирует его в DataTables, затем отображает и позволяет редактировать содержимое в стандартной DataGrid. Затем он сохранит отредактированный контент обратно в файл XML (DataSet.WriteXML ()).

0 голосов
/ 19 августа 2009

Все app.config и web.config являются просто файлами XML. Вы можете открывать и редактировать их, используя XMLDocument, XMLWriter и т. Д.

...