Можно ли загрузить App.Config из строки или потока памяти?

StackOverflow https://stackoverflow.com/questions/417253

Вопрос

Я знаю, что могу загрузить файл app.config из другого места, используя следующую строку кода:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", ConfigFile);

где ConfigFile - это полный путь. Однако я хотел бы загрузить файл, зашифрованный для app.config. В идеале я хотел бы иметь возможность загрузить файл, расшифровать его, загрузить в строку или поток памяти и передать его в приложение, как если бы это был app.config. Я знаю, что мог бы просто загрузить из него все значения и получить к ним доступ вручную, но я бы хотел иметь к ним доступ, используя встроенную функциональность .NET. Есть ли способ указать приложению использовать файл конфигурации из файла, отличного от файла?

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

Это было полезно?

Решение

Пока я так и не смог получить ответ на этот вопрос, мне пришлось придумать обходной путь. Возможно, это не лучшее решение, но оно работает. По сути, мы зашифровали наш файл app.config и дали ему новое имя. Когда приложение запускается, оно берет зашифрованный файл, расшифровывает его и записывает во временный файл Windows. Это гарантирует, что файл представляет собой какое-то уникальное случайное имя, которое никто не может найти, и нам не нужно управлять файлами, поскольку Windows автоматически удалит его для нас. Таким образом, при каждом перезапуске мы можем переписать новый файл и использовать его. Вот основные фрагменты кода для тех, кто заинтересован.

Этот первый метод, LoadFileAppConfig () , загрузит файл. В этом случае, поскольку они являются сервисами, нам нужно загрузить исполняемый путь и передать его соответствующему методу. Мы возвращаем путь к расшифрованному app.config, а затем используем метод SetData () , чтобы установить его как путь app.config.

/// <summary>
/// Loads the Local App.Config file, and sets it to be the local app.config file
/// </summary>
/// <param name="p_ConfigFilePath">The path of the config file to load, i.e. \Logs\</param>
public void LoadFileAppConfig(string p_ConfigFilePath)
{
    try
    {
        // The app.config path is the passed in path + Application Name + .config
        m_LocalAppConfigFile = ProcessLocalAppConfig(p_ConfigFilePath + this.ApplicationName + ".config");

        // This sets the service's app.config property
        AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", m_LocalAppConfigFile);
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

В этом методе мы получаем путь к файлу, передаем этот файл для дешифрования и возврата в виде строки, а затем записываем этот файл в наш временный файл Windows.

public string ProcessLocalAppConfig(string p_ConfigFilePath)
{
    try
    {
        string fileName = Path.GetTempFileName();
        string unencryptedConfig = DecryptConfigData(p_ConfigFilePath);

        FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write);
        StreamWriter streamWriter = new StreamWriter(fileStream);

        if (!string.IsNullOrEmpty(unencryptedConfig))
        {
            try
            {
                streamWriter.BaseStream.Seek(0, SeekOrigin.End);
                streamWriter.WriteLine(unencryptedConfig);
            }

            catch (IOException ex)
            {
                Debug.Assert(false, ex.ToString());
            }
            finally
            {
                streamWriter.Close();
            }
            return fileName;
        }
        return null;
    }
    catch (Exception)
    {
        throw;
    }
}

Этот последний метод берет путь к зашифрованному app.config, использует наш инструмент расшифровки для дешифрования файла (гарантируя, что мы можем расшифровать его, и что это правильный тип файла), а затем возвращает дешифрованное содержимое как Строка для метода выше.

private string DecryptConfigData(string p_AppConfigFile)
{
    string decryptedData = null;
    TMS.Pearl.SystemFramework.CryptographyManager.CryptographyManager cryptManager = new TMS.Pearl.SystemFramework.CryptographyManager.CryptographyManager();
    try
    {
        //Attempt to load the file.
        if (File.Exists(p_AppConfigFile))
        {
            //Load the file's contents and decrypt them if they are encrypted.
            string rawData = File.ReadAllText(p_AppConfigFile);

            if (!string.IsNullOrEmpty(rawData))
            {
                if (!rawData.Contains("<?xml"))  //assuming that all unencrypted config files will start with an xml tag...
                {
                    decryptedData = cryptManager.Decrypt(rawData);
                }
                else
                {
                    decryptedData = rawData;
                }
            }
        }
    }
    catch (Exception)
    {
        throw;
    }

    return decryptedData;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top