كيف يمكنني تحديد أقسام web.config المخصصة مع العناصر والسمات الفرعية المحتملة للخصائص؟

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

  •  08-06-2019
  •  | 
  •  

سؤال

غالبًا ما تتطلب تطبيقات الويب التي أقوم بتطويرها إعدادات تكوين تابعة، وهناك أيضًا إعدادات يجب أن تتغير أثناء تنقلنا بين كل بيئة من بيئاتنا.

جميع إعداداتنا حاليًا عبارة عن أزواج قيمة أساسية بسيطة، ولكن قد يكون من المفيد إنشاء أقسام تكوين مخصصة بحيث يكون من الواضح متى تحتاج قيمتان إلى التغيير معًا أو عندما تحتاج الإعدادات إلى التغيير لبيئة ما.

ما هي أفضل طريقة لإنشاء أقسام التكوين المخصصة وهل هناك أي اعتبارات خاصة يجب مراعاتها عند استرداد القيم؟

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

المحلول

استخدام السمات وأقسام التكوين التابعة والقيود

هناك أيضًا إمكانية استخدام السمات التي تعتني بالسباكة تلقائيًا، بالإضافة إلى توفير القدرة على إضافة القيود بسهولة.

أقدم هنا مثالاً من الكود الذي أستخدمه بنفسي في أحد مواقعي.مع وجود قيد، أقوم بتحديد الحد الأقصى لمساحة القرص التي يُسمح لأي مستخدم باستخدامها.

MailCenterConfiguration.cs:

namespace Ani {

    public sealed class MailCenterConfiguration : ConfigurationSection
    {
        [ConfigurationProperty("userDiskSpace", IsRequired = true)]
        [IntegerValidator(MinValue = 0, MaxValue = 1000000)]
        public int UserDiskSpace
        {
            get { return (int)base["userDiskSpace"]; }
            set { base["userDiskSpace"] = value; }
        }
    }
}

تم إعداد هذا في web.config مثل ذلك

<configSections>
    <!-- Mailcenter configuration file -->
    <section name="mailCenter" type="Ani.MailCenterConfiguration" requirePermission="false"/>
</configSections>
...
<mailCenter userDiskSpace="25000">
    <mail
     host="my.hostname.com"
     port="366" />
</mailCenter>

عناصر الطفل

عنصر XML الفرعي بريد يتم إنشاؤه في نفس ملف .cs مثل الملف أعلاه.لقد أضفت هنا قيودًا على المنفذ.إذا تم تعيين قيمة للمنفذ ليست في هذا النطاق، فسوف يشتكي وقت التشغيل عند تحميل التكوين.

MailCenterConfiguration.cs:

public sealed class MailCenterConfiguration : ConfigurationSection
{
    [ConfigurationProperty("mail", IsRequired=true)]
    public MailElement Mail
    {
        get { return (MailElement)base["mail"]; }
        set { base["mail"] = value; }
    }

    public class MailElement : ConfigurationElement
    {
        [ConfigurationProperty("host", IsRequired = true)]
        public string Host
        {
            get { return (string)base["host"]; }
            set { base["host"] = value; }
        }

        [ConfigurationProperty("port", IsRequired = true)]
        [IntegerValidator(MinValue = 0, MaxValue = 65535)]
        public int Port
        {
            get { return (int)base["port"]; }
            set { base["port"] = value; }
        }

يستخدم

لاستخدامه عمليًا في التعليمات البرمجية، كل ما عليك فعله هو إنشاء مثيل لـ MailCenterConfigurationObject، وهذا سيؤدي إلى تلقائيا اقرأ الأقسام ذات الصلة من web.config.

MailCenterConfiguration.cs

private static MailCenterConfiguration instance = null;
public static MailCenterConfiguration Instance
{
    get
    {
        if (instance == null)
        {
            instance = (MailCenterConfiguration)WebConfigurationManager.GetSection("mailCenter");
        }

        return instance;
    }
}

ملف آخر.cs

public void SendMail()
{
    MailCenterConfiguration conf = MailCenterConfiguration.Instance;
    SmtpClient smtpClient = new SmtpClient(conf.Mail.Host, conf.Mail.Port);
}

التحقق من الصلاحية

لقد ذكرت سابقًا أن وقت التشغيل سوف يشكو عند تحميل التكوين وعدم امتثال بعض البيانات للقواعد التي قمت بإعدادها (على سبيل المثال.في MailCenterConfiguration.cs).أميل إلى معرفة هذه الأشياء في أقرب وقت ممكن عندما يتم تشغيل موقعي.إحدى طرق حل هذه المشكلة هي تحميل التكوين في _Global.asax.cx.Application_Start_، إذا كان التكوين غير صالح، فسيتم إعلامك بذلك عن طريق استثناء.لن يبدأ تشغيل موقعك، وبدلاً من ذلك سيتم تقديم معلومات تفصيلية عن الاستثناء في ملف شاشة الموت الصفراء.

Global.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}

نصائح أخرى

سريعة وقذرة:

أولا قم بإنشاء الخاص بك قسم التكوين و عنصر التكوين الطبقات:

public class MyStuffSection : ConfigurationSection
{
    ConfigurationProperty _MyStuffElement;

    public MyStuffSection()
    {
        _MyStuffElement = new ConfigurationProperty("MyStuff", typeof(MyStuffElement), null);

        this.Properties.Add(_MyStuffElement);
    }

    public MyStuffElement MyStuff
    {
        get
        {
            return this[_MyStuffElement] as MyStuffElement;
        }
    }
}

public class MyStuffElement : ConfigurationElement
{
    ConfigurationProperty _SomeStuff;

    public MyStuffElement()
    {
        _SomeStuff = new ConfigurationProperty("SomeStuff", typeof(string), "<UNDEFINED>");

        this.Properties.Add(_SomeStuff);
    }

    public string SomeStuff
    {
        get
        {
            return (String)this[_SomeStuff];
        }
    }
}

ثم دع إطار العمل يعرف كيفية التعامل مع فئات التكوين الخاصة بك web.config:

<configuration>
  <configSections>
    <section name="MyStuffSection" type="MyWeb.Configuration.MyStuffSection" />
  </configSections>
  ...

وفي الواقع قم بإضافة القسم الخاص بك أدناه:

  <MyStuffSection>
    <MyStuff SomeStuff="Hey There!" />
  </MyStuffSection>

ثم يمكنك استخدامه في التعليمات البرمجية الخاصة بك على النحو التالي:

MyWeb.Configuration.MyStuffSection configSection = ConfigurationManager.GetSection("MyStuffSection") as MyWeb.Configuration.MyStuffSection;

if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}

هناك ممتاز مثال على MSDN استخدام ConfigurationCollection و.NET 4.5 للأقسام المخصصة في web.config التي تحتوي على قائمة بعناصر التكوين.

يعد التكوين المخصص أمرًا مفيدًا للغاية وغالبًا ما تنتهي التطبيقات بطلب حل قابل للتوسيع.

بالنسبة لـ .NET 1.1، يرجى الرجوع إلى المقالة http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

ملحوظة:يعمل الحل أعلاه مع .NET 2.0 أيضًا.

للحصول على حل خاص بـ .NET 2.0، يرجى الرجوع إلى المقالة http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

يمكنك تحقيق ذلك باستخدام معالجات القسم.هناك نظرة عامة أساسية حول كيفية كتابة واحدة في http://www.codeproject.com/KB/aspnet/ConfigSections.aspx ومع ذلك فهو يشير إلى app.config والذي سيكون مشابهًا إلى حد كبير لكتابة واحد للاستخدام في web.config.سيسمح لك هذا بالحصول على شجرة XML خاصة بك في ملف التكوين وإجراء بعض التكوينات الأكثر تقدمًا.

الطريقة الأسهل التي وجدتها هي الاستخدام قسم إعدادات التطبيق.

  1. أضف إلى Web.config ما يلي:

    <appSettings>
        <add key="MyProp" value="MyVal"/>
    </appSettings>
    

  2. الوصول من التعليمات البرمجية الخاصة بك

    NameValueCollection appSettings = ConfigurationManager.AppSettings;
    string myPropVal = appSettings["MyProp"];
    

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