Jak zdefiniować niestandardowe sekcje web.config z potencjalnymi elementów podrzędnych i atrybuty dla właściwości?

głosy
59

Aplikacje web rozwijam często wymagają współzależne ustawienia konfiguracyjne i są też ustawienia, które mają zmienić jak poruszać się pomiędzy każdym z naszych środowiskach.

Wszystkie nasze ustawienia są obecnie proste pary wartość klucza, ale dobrze byłoby, aby utworzyć sekcje niestandardowe config tak, że jest oczywiste, gdy dwie wartości trzeba zmieniać razem lub gdy ustawienia trzeba zmienić dla środowiska.

Jaki jest najlepszy sposób, aby tworzyć własne sekcje konfiguracyjne i czy są jakieś specjalne względy, aby przy pobieraniu wartości?

Utwórz 05/08/2008 o 13:13
źródło użytkownik
W innych językach...                            


6 odpowiedzi

głosy
2

Można to zrobić z obsługi sekcji. Jest to podstawowy przegląd jak napisać jeden na http://www.codeproject.com/KB/aspnet/ConfigSections.aspx jednak odnosi się to do app.config co byłoby niemal tak samo jak pisanie jeden do wykorzystania w sieci. config. Pozwoli to na zasadzie mieć własne drzewo XML w pliku konfiguracyjnym i trochę bardziej zaawansowaną konfigurację.

Odpowiedział 05/08/2008 o 13:25
źródło użytkownik

głosy
11

Quick'n Brudny:

Najpierw utworzyć ConfigurationSection i ConfigurationElement klas:

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

Pozwól ramy wie jak obsługiwać klas konfiguracji w pliku web.config :

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

I rzeczywiście dodać własną sekcję poniżej:

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

Wtedy można go używać w kodzie w następujący sposób:

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

if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}
Odpowiedział 05/08/2008 o 13:51
źródło użytkownik

głosy
74

Używanie atrybutów, sekcje konfiguracyjne dziecko i ograniczenia

Istnieje również możliwość korzystania z atrybutów, które automatycznie dba o kanalizacji, jak również zapewniając możliwość łatwego dodawania ograniczeń.

I tutaj przedstawić przykład z kodu używam siebie w jednym z moich stron. Z ograniczeniem, że dyktują maksymalną ilość miejsca na dysku jednego użytkownik może korzystać.

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 skonfigurowany tak jak w pliku 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>

elementy potomne

Xml dziecko elementem elektronicznej jest tworzony w pliku same .cs jak ten powyżej. Tutaj Dodałem ograniczeń na porcie. Jeśli port jest przypisana wartość nie w tym przedziale środowisko wykonawcze będą narzekać kiedy config jest załadowany.

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

Posługiwać się

Aby następnie wykorzystać je praktycznie w kodzie, wszystko co musisz zrobić, to instancję MailCenterConfigurationObject, to będzie automatycznie odczytać odpowiednie sekcje z 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);
}

Sprawdzić ważności

I wcześniej wspomniano, że czas pracy będzie skarżyć, gdy konfiguracja jest zapisana, a niektóre dane nie są zgodne z zasadami zostały skonfigurowane (np MailCenterConfiguration.cs). I mają tendencję do chcą wiedzieć takie rzeczy jak najszybciej, gdy moja strona odpala. Jednym ze sposobów rozwiązania tego jest załadować konfigurację w _Global.asax.cx.Application_Start_, jeśli konfiguracja jest nieprawidłowa użytkownik zostanie powiadomiony o tym ze środków wyjątek. Twoja witryna nie zostanie uruchomiona, a zamiast tego zostanie wyświetlone szczegółowe informacje o wyjątku w żółtym ekran śmierci .

Global.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}
Odpowiedział 05/08/2008 o 23:17
źródło użytkownik

głosy
3

Konfiguracja niestandardowej są bardzo poręczne, co często kończy się wnioski z żądaniem wysuwanym rozwiązania.

NET 1.1 patrz artykuł http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

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

NET 2.0 konkretnego rozwiązania, patrz artykuł http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

Odpowiedział 13/02/2009 o 14:45
źródło użytkownik

głosy
4

Jest to doskonały przykład na MSDN użyciu ConfigurationCollectioni .NET 4.5 dla niestandardowych sekcji w pliku web.config, który ma listę elementów konfiguracyjnych.

Odpowiedział 19/09/2013 o 16:39
źródło użytkownik

głosy
1

Najprostszy sposób, który znalazł, stosuje sekcji appSettings .

  1. Dodaj do web.config następujący:

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

  2. Dostęp z kodem

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

Odpowiedział 04/02/2017 o 17:59
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more