باستخدام ConfigurationManager لتحميل التكوين من مكان التعسفي
-
08-06-2019 - |
سؤال
أنا البلدان النامية من الوصول إلى المكونات التي سيتم استخدامها في موقع ويب الذي يحتوي على مزيج من الكلاسيكية و 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