باستخدام ConfigurationManager لتحميل التكوين من مكان التعسفي

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

سؤال

أنا البلدان النامية من الوصول إلى المكونات التي سيتم استخدامها في موقع ويب الذي يحتوي على مزيج من الكلاسيكية و ASP ASP.NET صفحات بحاجة إلى وسيلة جيدة لإدارة إعدادات التكوين.

أود أن استخدام مخصص ConfigurationSection, ، ASP.NET صفحات هذا يعمل كبيرة.ولكن عندما المكون دعا عبر COM إمكانية التشغيل المتداخل من الكلاسيكية صفحة ASP مكون ليست قيد التشغيل في سياق ASP.NET طلب وبالتالي لا يوجد لديه المعرفة على شبكة الإنترنت.config.

هل هناك طريقة لنقول ConfigurationManager مجرد تحميل التكوين من تعسفيا المسار (مثل ..\web.config إذا كان بلدي الجمعية في /bin المجلد)?إذا كان هناك ثم أفكر في بلدي مكون يمكن أن تقع مرة أخرى إلى أنه إذا كان الافتراضي ConfigurationManager.GetSection يعود null بالنسبة لي قسم مخصص.

أي مناهج أخرى أن هذا سيكون موضع ترحيب!

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

المحلول

جرب هذا:

System.Configuration.ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath); //Path to your config file
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedMachineConfiguration(fileMap);

نصائح أخرى

حل آخر هو تجاوز الافتراضي تكوين بيئة مسار الملف.

أجد أنه أفضل حل من غير تافهة-تكوين مسار تحميل الملف تحديدا أفضل طريقة إرفاق ملف التكوين إلى dll.

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", <Full_Path_To_The_Configuration_File>);

على سبيل المثال:

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", @"C:\Shared\app.config");

مزيد من التفاصيل يمكن الاطلاع على هذا بلوق.

بالإضافة إلى ذلك ، هذه إجابة أخرى وقد حل ممتاز, كاملة مع رمز التحديث التطبيق التكوين ، IDisposable كائن إلى إعادة تعيين مرة أخرى إلى حالته الأصلية.مع هذا الحل يمكنك الاحتفاظ المؤقت التطبيق التكوين راقب:

using(AppConfig.Change(tempFileName))
{
    // tempFileName is used for the app config during this context
}

Ishmaeel الجواب عموما لا العمل ، ومع ذلك وجدت مسألة واحدة ، وهي أن استخدام OpenMappedMachineConfiguration يبدو أن تفقد ورثت القسم مجموعات من آلة.config.هذا يعني أنه يمكنك الوصول المخصصة الخاصة بك أقسام (وهو المرجع أراد) ، ولكن ليس على النظام العادي أقسام.على سبيل المثال هذا الكود لا يعمل:

ConfigurationFileMap fileMap = new ConfigurationFileMap(strConfigPath);
Configuration configuration = ConfigurationManager.OpenMappedMachineConfiguration(fileMap);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;  // returns null

في الأساس, إذا وضعت ساعة على configuration.SectionGroups, سترى أن system.net لم يتم تسجيل مثل SectionGroup, لذلك الى حد كبير لا يمكن الوصول إليها من خلال القنوات العادية.

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

<sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <sectionGroup name="mailSettings" type="System.Net.Configuration.MailSettingsSectionGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <section name="smtp" type="System.Net.Configuration.SmtpSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  </sectionGroup>
</sectionGroup>

أنا غير متأكد من تطبيق ويب في حد ذاته سوف تعمل بشكل صحيح بعد ذلك ، ولكن يمكنك الوصول إلى sectionGroups بشكل صحيح.

الحل الثاني هو بدلا من ذلك إلى فتح الويب الخاص بك.التكوين كما EXE التكوين ، الذي ربما يكون أقرب إلى المقصود وظيفة على أي حال:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = strConfigPath };
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
MailSettingsSectionGroup thisMail = configuration.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;  // returns valid object!

ونحسب أن أيا من الإجابات المقدمة هنا ولا الألغام أو Ishmaeel ، تماما استخدام هذه الدالات كيف .صافي المصممين المقصود.ولكن يبدو أن هذا العمل بالنسبة لي.

بالإضافة إلى Ishmaeel الجواب, طريقة OpenMappedMachineConfiguration() سوف يعود دائما Configuration الكائن.حتى تحقق لمعرفة ما إذا كان تحميل يجب عليك التحقق HasFile الممتلكات التي صحيحا يعني أنه جاء من ملف.

أنا قدمت تكوين القيم إلى كلمة استضافتها .صافي Compoent على النحو التالي.

أ .صافي مكتبة فئة عنصر يطلق/استضافتها في برنامج MS Word.توفير تكوين القيم إلى المكون ، أنا خلق winword.exe.التكوين في C:\Program Files\Microsoft Office\OFFICE11 مجلد.يجب أن تكون قادرا على قراءة تكوينات القيم مثلك التقليدية .صافي.

string sMsg = System.Configuration.ConfigurationManager.AppSettings["WSURL"];

الجواب المقبول هو الخطأ!!

فإنه يلقي الاستثناء التالي على الوصول إلى AppSettings الملكية:

غير قادر على تحويل كائن من النوع 'System.التكوين.DefaultSection' إلى النوع 'System.التكوين.AppSettingsSection'.

هنا هو الحل الصحيح:

System.Configuration.ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "YourFilePath";
System.Configuration.Configuration configuration = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

بالنسبة ASP.NET استخدام WebConfigurationManager:

var config = WebConfigurationManager.OpenWebConfiguration("~/Sites/" + requestDomain + "/");
(..)
config.AppSettings.Settings["xxxx"].Value;

استخدام معالجة XML:

var appPath = AppDomain.CurrentDomain.BaseDirectory;
var configPath = Path.Combine(appPath, baseFileName);;
var root = XElement.Load(configPath);

// can call root.Elements(...)

هذا ينبغي أن تفعل خدعة :

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", "newAppConfig.config);

المصدر : https://www.codeproject.com/Articles/616065/Why-Where-and-How-of-NET-Configuration-Files

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top