تعديل قسم التكوين برمجياً بثقة متوسطة
-
27-10-2019 - |
سؤال
لدي قسم تكوين مخصص في طلبي:
public class SettingsSection : ConfigurationSection
{
[ConfigurationProperty("Setting")]
public MyElement Setting
{
get
{
return (MyElement)this["Setting"];
}
set { this["Setting"] = value; }
}
}
public class MyElement : ConfigurationElement
{
public override bool IsReadOnly()
{
return false;
}
[ConfigurationProperty("Server")]
public string Server
{
get { return (string)this["Server"]; }
set { this["Server"] = value; }
}
}
في ملف web.config الخاص بي
<configSections>
<sectionGroup name="mySettingsGroup">
<section name="Setting"
type="MyWebApp.SettingsSection"
requirePermission="false"
restartOnExternalChanges="true"
allowDefinition="Everywhere" />
</sectionGroup>
</configSections>
<mySettingsGroup>
<Setting>
<MyElement Server="serverName" />
</Setting>
</mySettingsGroup>
قراءة القسم يعمل بشكل جيد.المشكلة التي أواجهها هي أنني عندما أقرأ القسم عبر
var settings = (SettingsSection)WebConfigurationManager.GetSection("mySettingsGroup/Setting");
وبعد ذلك أشرع في تعديل Server
ملكية:
settings.Server = "something";
لا يؤدي هذا إلى تعديل خاصية "الخادم" في ملف web.config.
ملحوظة:يجب أن يعمل هذا في ظل ثقة متوسطة، لذا لا يمكنني استخدامه WebConfigurationManager.OpenWebConfiguration
الذي يعمل بشكل جيد.هل هناك طريقة واضحة لإخبار ConfigSection
لإنقاذ نفسها؟
المحلول
إجابة قصيرة - لا.كان فريق .NET (يُزعم) يهدف إلى إصلاح هذه المشكلة في الإصدار 4، لكن ذلك لم يحدث.
والسبب هو الاستخدام WebConfigurationManager.GetSection
إرجاع متداخلة للقراءة فقط NameValueCollection
s، والتي لا تستمر عند تغيير قيمها.استخدام WebConfigurationManager.OpenWebConfiguration
, ، كما تأكدت تمامًا، هي الطريقة الوحيدة للحصول على حق الوصول للقراءة والكتابة إلى التكوين - ولكن بعد ذلك ستحصل على FileIOPermission
استثناء القيت، كما OpenWebConfiguration
يحاول تحميل كافة التكوينات الموروثة وصولاً إلى web.config الخاص بك - والتي تتضمن ملفات web.config وmachine.config على مستوى الجهاز في C:\WINDOWS\Microsoft.NET\Framework
, ، والتي تقع بوضوح خارج نطاق الثقة المتوسطة.
إجابة طويلة - استخدم XDocument
/ XmlDocument
و XPath للحصول على/تعيين قيم التكوين.