IT박스

속성에 대한 잠재적 자식 요소 및 특성을 사용하여 사용자 지정 web.config 섹션을 어떻게 정의합니까?

itboxs 2020. 11. 15. 11:03
반응형

속성에 대한 잠재적 자식 요소 및 특성을 사용하여 사용자 지정 web.config 섹션을 어떻게 정의합니까?


내가 개발하는 웹 응용 프로그램에는 종종 상호 종속적 인 구성 설정이 필요하며 각 환경간에 이동할 때 변경해야하는 설정도 있습니다.

우리의 모든 설정은 현재 간단한 키 값 쌍이지만 두 값을 함께 변경해야하거나 환경에 맞게 설정을 변경해야 할 때 명확하게 사용자 지정 구성 섹션을 만드는 것이 유용 할 것입니다.

사용자 지정 구성 섹션을 만드는 가장 좋은 방법은 무엇이며 값을 검색 할 때 특별히 고려해야 할 사항이 있습니까?


속성, 하위 구성 섹션 및 제약 조건 사용

또한 배관을 자동으로 처리하는 속성을 사용하고 제약 조건을 쉽게 추가 할 수있는 기능을 제공 할 수도 있습니다.

여기에서는 내 사이트 중 하나에서 직접 사용하는 코드의 예를 제시합니다. 제약 조건에 따라 한 사용자가 사용할 수있는 최대 디스크 공간을 지정합니다.

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

Quick'n Dirty :

먼저 ConfigurationSectionConfigurationElement 클래스를 만듭니다 .

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

Then let the framework know how to handle your configuration classes in web.config:

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

And actually add your own section below:

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

Then you can use it in your code thus:

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

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

There's an excellent example on MSDN using ConfigurationCollection and .NET 4.5 for custom sections in web.config that has a list of config items.


The custom configuration are quite handy thing and often applications end up with a demand for an extendable solution.

For .NET 1.1 please refer the article http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

Note: The above solution works for .NET 2.0 as well.

For .NET 2.0 specific solution, please refer the article http://aspnet.4guysfromrolla.com/articles/032807-1.aspx


You can accomplish this with Section Handlers. There is a basic overview of how to write one at http://www.codeproject.com/KB/aspnet/ConfigSections.aspx however it refers to app.config which would be pretty much the same as writing one for use in web.config. This will allow you to essentially have your own XML tree in the config file and do some more advanced configuration.


The most simple method, which I found, is using appSettings section.

  1. Add to Web.config the following:

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

  2. Access from your code

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

참고URL : https://stackoverflow.com/questions/2155/how-do-i-define-custom-web-config-sections-with-potential-child-elements-and-att

반응형