Подтвердить что ты не робот

Как определить пользовательские разделы web.config с потенциальными дочерними элементами и атрибутами свойств?

В разрабатываемых веб-приложениях часто требуются созависимые параметры конфигурации, а также параметры, которые необходимо изменить при перемещении между каждой из наших сред.

Все наши настройки в настоящее время представляют собой простые пары ключевых значений, но было бы полезно создавать пользовательские разделы конфигурации, чтобы это было очевидно, когда два значения должны были измениться вместе или когда параметры необходимо изменить для среды.

Какой лучший способ создать пользовательские разделы конфигурации и есть ли какие-либо особые соображения, которые нужно сделать при извлечении значений?

4b9b3361

Ответ 1

Использование атрибутов, дочерних конфигурационных разделов и ограничений

Существует также возможность использовать атрибуты, которые автоматически заботятся о сантехнике, а также предоставляют возможность легко добавлять ограничения.

Здесь я приведу пример из кода, который я использую сам на одном из моих сайтов. При ограничении я определяю максимальный объем дискового пространства, который может использовать один пользователь.

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;
    }
}

AnotherFile.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;
}

Ответ 2

Quick'n Dirty:

Сначала создайте классы ConfigurationSection и ConfigurationElement:

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);
}

Ответ 3

Отличный пример в MSDN с использованием ConfigurationCollection и .NET 4.5 для пользовательских разделов в web.config, который имеет список элементов конфигурации.

Ответ 4

Пользовательская конфигурация довольно удобна, и часто приложения заканчиваются требованием для расширяемого решения.

Для .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

Ответ 5

Вы можете выполнить это с помощью Обработчиков разделов. Существует базовый обзор того, как написать один из http://www.codeproject.com/KB/aspnet/ConfigSections.aspx, однако он относится к app.config, который был бы почти таким же, как для записи один для использования в web.config. Это позволит вам по существу иметь собственное дерево XML в файле конфигурации и сделать еще более расширенную конфигурацию.

Ответ 6

Самый простой метод, который я нашел, использует appSettings.

  • Добавьте в Web.config следующее:

    <appSettings>
        <add key="MyProp" value="MyVal"/>
    </appSettings>
    
  • Доступ из вашего кода

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