Как читать и обновлять внешний файл web.config с помощью приложения ac # Windows Forms - PullRequest
0 голосов
/ 31 января 2019

Я создаю приложение ac # Windows для поддержки веб-приложения - специально для создания и обновления значений в файле web.config.Я попробовал много предложений здесь, но все они просто описывают чтение и запись файлов конфигурации из приложения.Часть web.config:

- 
 <configuration>
    <system.web>
        <customErrors mode="Off"/>

        <compilation debug="true" targetFramework="4.0" />
        <globalization culture="" enableClientBasedCulture="true" uiCulture="" />

        <pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" />
    </system.web>
    <appSettings>
        <add key="DocPath" value="~/serverdocs/docs" />

        <add key="TextForLabel1" value="This is some text"/>
..

Я пытался прочитать файл - специальные все ключи из appSettings - как

    var xmlDoc = new XmlDocument();
        xmlDoc.Load(FName); // name and path from web.config file

А затем прочитать все узлы, как:

            foreach (XmlNodeList xmlnodes in xmlDoc.SelectNodes("configuration/appSettings"))
            {
                foreach ( XmlNode node in xmlnodes)
                {
                string MyKey = node.Name;
                string MyVal = node.Value;
                }

            }  

Но всегда есть ошибки, например. Объект типа "System.Xml.XmlDeclaration" не может быть преобразован в тип "System.Xml.XmlNodeList".Или элементы просто не найдены в зависимости от того, как я пишу выбранное значение.Я пробовал «// configuration» и «configuration / appSettings» и другие.

Иногда я, вероятно, слепо читаю свой собственный код и обнаруживаю ошибку - извините - любые предложения приветствуются.

Ответы [ 3 ]

0 голосов
/ 31 января 2019

У меня была похожая проблема, и я пошел по той же дороге, что и вы, пытаясь пройтись по дереву XML, чтобы найти узел, который мне нужно было изменить.Это была пара ключ / значение, определяющая URI для соединения с веб-службой.URI по умолчанию указывал на localhost, например:

    <add key="ProcessorService" value="https://localhost/Processor/ProcessorService.asmx" />

... и мне нужно было указать его на сервере, на котором фактически выполнялась служба, в зависимости от того, на каком сервере она работает (Dev, QA,UAT, Prod, и т.Разумеется, каждый файл web.config был по-разному структурирован.

Я решил это с помощью регулярного выражения в сценарии установки PowerShell для сайтов, вот фрагмент:

(Get-Content $webConfig -Encoding UTF8) | `
    ForEach-Object {$_ -replace 'localhost', "$dnsName" } | `
    Set-Content $webConfig

Я запустил вышеизложенное внутрицикла, который проходил через каждый файл web.config в каждом каталоге, вносил изменения, затем сохранял файл с помощью командлета Set-Content.

Я могу понять, если у вас есть , чтобы сделатьв C # вы всегда можете просто открыть файл в виде потока, настроить несколько объектов Regex и выполнить по существу ту же операцию.

Me?Лично я ненавижу ходить XML, если я не вынужденВы, безусловно, можете сделать это таким образом, но если кто-то придет и переставит ваш файл web.config, он сломает ваш красиво созданный XML-ходок, и вы начнете все сначала.Таким образом, до тех пор, пока то, что вы меняете, не изменится (сильно), оно должно работать просто отлично.

0 голосов
/ 31 января 2019

, чтобы прочитать это:

   var xmlDoc = new XmlDocument();
    xmlDoc.Load(FName);
    DataTable DTConfig = new DataTable();
    DTConfig.Columns.Add("Key", typeof(string));
    DTConfig.Columns.Add("Value", typeof(string));
    DTConfig.Columns.Add("OldValue", typeof(string));
    try
    {
        foreach (XmlElement xmlElement in xmlDoc.SelectNodes("configuration/appSettings"))
        {
            foreach (XmlNode node in xmlElement)
            {
                if (node.Attributes != null && node.Attributes.Count > 1)
                {
                    string MyKey = "";
                    string MyVal = "";
                    if (node.Attributes[0].Value != null)
                    {
                        MyKey = node.Attributes[0].Value;
                    }
                    if (node.Attributes[1].Value != null)
                    {
                        MyVal = node.Attributes[1].Value;
                    }
                    DataRow DR = DTConfig.NewRow();
                    DR["Key"] = MyKey;
                    DR["Value"] = MyVal;
                    DR["OldValue"] = MyVal;
                    if (MyKey != "")
                    {
                        DTConfig.Rows.Add(DR);
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        Debug.Print(ex.Message);
    }
    TxtFname.Text = FName;
    DGConfig.DataSource = DTConfig;
    return true;

Объект данных связан с сеткой данных - вот и все

0 голосов
/ 31 января 2019

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

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

Configuration cfg = WebConfigurationManager.OpenWebConfiguration("YOUR_WEB_CONFIG");

Когда у вас есть данные в объекте Configuration, вы можете перечислить разделы и значения файла конфигурации.

Вам нужно будет добавить ссылку на обаSystem.Configuration и System.Web, чтобы использовать вышеуказанное.

РЕДАКТИРОВАТЬ

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

public static Configuration OpenConfigFile(string configPath)
{
    var configFile = new FileInfo(configPath);
    var vdm = new VirtualDirectoryMapping(configFile.DirectoryName, true, configFile.Name);
    var wcfm = new WebConfigurationFileMap();
    wcfm.VirtualDirectories.Add("/", vdm);
    return WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");
}

Для использования:

Configuration cfg = OpenConfigFile(@"YOUR_WEB_CONFIG");
...