سؤال

وأنا أعلم أنني يمكن تحميل ملف app.config من موقع مختلف باستخدام السطر التالي من التعليمات البرمجية:

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

وحيث ConfigFile هو موقع المسار الكامل. ما أود القيام به هو على الرغم من أن تكون قادرة على تحميل ملف التي تم تشفيرها لapp.config. من الناحية المثالية، أود أن تكون قادرة على تحميل الملف، فك تشفيرها، وتحميله في تيار سلسلة أو الذاكرة وتمريرها إلى التطبيق كما لو كانت app.config. وأنا أعلم أنا فقط يمكن تحميل كافة القيم منها والوصول إليها يدويا، ولكن أود أن تكون قادرة على الوصول إليها باستخدام المدمج في وظائف .NET. هل هناك طريقة لمعرفة التطبيق لاستخدام ملف التكوين من شيء آخر غير ملف؟

والخيار الآخر هو لفتح الملف، فك تشفيرها، والكتابة إلى ملف مؤقت، ومن ثم استخدام رمز أعلاه إلى مرجع له بهذه الطريقة، ولكن إذا كان هناك طريقة أسهل، من الناحية المثالية، أود أن العثور عليه، لدينا لتجنب التعامل مع ملفات إضافية.

هل كانت مفيدة؟

المحلول

وبينما كنت أبدا قادرا على الحصول على إجابة لهذا حتى الآن، واضطررت الى الخروج مع عمل حول. هذا قد لا يكون أفضل حل، لكنه لم ينجح. أساسا ما فعلناه هو encypted ملف app.config لدينا، ومنحها اسما جديدا. عندما يبدأ التطبيق يصل، وسوف يستغرق الملف encypted، decyrpt، والكتابة إلى ملف مؤقت ويندوز. وهذا يضمن أن الملف هو بعض اسم عشوائي فريد أن لا أحد من المرجح أن يجد، ونحن لم يكن لديك لإدارة الملفات، ويندوز سوف حذفه بالنسبة لنا تلقائيا. هذه الطريقة في كل إعادة إطلاق ونحن قادرون على إعادة الكتابة خارج ملف جديد واستخدامها. وهنا مقتطفات الشفرة الأساسية لمن يهمه الأمر.

وهذه الطريقة الأول، 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;
    }
}

في هذه الطريقة نحن الحصول على مسار الملف، ويمر هذا الملف خارج ليكون فك وعاد كسلسلة، ثم كتابة هذا الملف إلى ملف مؤقت ويندوز ل.

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