Jak zdefiniować własną stronę internetową.sekcje config z potencjalnymi elementami potomnymi i atrybutami dla właściwości?

Tworzone przeze mnie aplikacje internetowe często wymagają współzależnych ustawień konfiguracyjnych i są też ustawienia, które muszą się zmieniać, gdy poruszamy się między poszczególnymi środowiskami.

Wszystkie nasze ustawienia są obecnie prostymi parami wartości klucza, ale warto byłoby utworzyć niestandardowe sekcje konfiguracji, aby było oczywiste, kiedy dwie wartości muszą zmienić się razem lub kiedy ustawienia muszą zmienić się dla środowiska.

Jaki jest najlepszy sposób na tworzenie niestandardowych sekcji konfiguracyjnych i są czy są jakieś szczególne względy do podjęcia podczas pobierania wartości?

 61
Author: Chris, 2008-08-05

6 answers

Używanie atrybutów, podrzędnych sekcji konfiguracyjnych i ograniczeń

Istnieje również możliwość korzystania z atrybutów, które automatycznie dbają o instalację wodno-kanalizacyjną, a także zapewniają możliwość łatwego dodawania ograniczeń.

Przedstawiam tutaj przykład z kodu, którego używam na jednej z moich stron. Z ograniczeniem dyktuję maksymalną ilość miejsca na dysku, z którego może korzystać każdy użytkownik.

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

To jest ustawione w sieci.config like so

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

Elementy potomne

Potomny element xml mail jest tworzony w tym samym .plik cs jak wyżej. Tutaj dodałem ograniczenia dotyczące portu. Jeśli portowi zostanie przypisana wartość nie mieszcząca się w tym zakresie, runtime będzie narzekać podczas ładowania konfiguracji.

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

Użyj

Aby użyć go praktycznie w kodzie, wystarczy utworzyć instancję obiektu MailCenterConfigurationObject, spowoduje to automatycznie odczytaj odpowiednie sekcje z sieci.config.

MailCenterConfiguration.cs

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

        return instance;
    }
}

Kolejny plik.cs

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

Sprawdź ważność

Wspomniałem wcześniej, że runtime będzie narzekać, gdy konfiguracja zostanie załadowana, a niektóre dane nie będą zgodne z ustawionymi regułami (np. w MailCenterConfiguration.cs). Zazwyczaj chcę wiedzieć te rzeczy tak szybko, jak to możliwe, gdy moja strona się uruchomi. Jednym ze sposobów rozwiązania tego problemu jest załadowanie konfiguracja w _Global.asax. CX. Application_Start_, jeśli konfiguracja jest nieprawidłowa, zostaniesz o tym powiadomiony za pomocą wyjątku. Twoja strona nie uruchomi się, a zamiast tego pojawią się szczegółowe informacje o wyjątkach w żółtym ekranie śmierci .

Globalny.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}
 75
Author: andnil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-04 15:40:48

Quick ' N Dirty:

Najpierw Utwórz swoje klasyConfigurationSection i 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];
        }
    }
}

Następnie daj framework znać, jak obsługiwać swoje klasy konfiguracyjne w web.config :

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

I faktycznie dodaj swój własny dział poniżej:

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

Wtedy możesz użyć go w swoim kodzie Tak:

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

if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}
 12
Author: Ishmaeel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-05 12:51:16

Istnieje doskonały przykład na MSDN przy użyciu ConfigurationCollection i.NET 4.5 dla niestandardowych sekcji w Internecie.config, który zawiera listę elementów config.

 5
Author: LordHits,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-19 15:39:43

Konfiguracja niestandardowa jest bardzo przydatna i często Aplikacje kończą się zapotrzebowaniem na rozszerzalne rozwiązanie.

Dla. NET 1.1 proszę zapoznać się z artykułem http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

Uwaga: powyższe rozwiązanie działa również dla. NET 2.0.

Dla specyficznego rozwiązania. NET 2.0, zapoznaj się z artykułem http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

 4
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-13 13:45:37

Możesz to osiągnąć za pomocą narzędzi do obsługi sekcji. Istnieje podstawowy przegląd tego, jak napisać jeden na http://www.codeproject.com/KB/aspnet/ConfigSections.aspx odnosi się jednak do app.config, który byłby prawie taki sam jak pisanie do użytku w sieci.config. To pozwoli Ci zasadniczo mieć własne drzewo XML w pliku konfiguracyjnym i zrobić bardziej zaawansowaną konfigurację.

 3
Author: John Downey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-05 12:25:20

Najprostszą metodą, jaką znalazłem, jest użycie sekcji appSettings .

  1. Dodaj do sieci.config the following:

    <appSettings>
        <add key="MyProp" value="MyVal"/>
    </appSettings>
    
  2. Dostęp z twojego kodu

    NameValueCollection appSettings = ConfigurationManager.AppSettings;
    string myPropVal = appSettings["MyProp"];
    
 2
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-04 17:59:32