속성에 대한 잠재적인 하위 요소 및 속성을 가진 사용자 지정 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; }
}
사용하다
코드에서 실제로 사용하려면 MailCenter Configuration Object를 인스턴스화하기만 하면 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;
}
퀵앤더티:
먼저 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);
}
사용자 지정 구성은 매우 편리하며 애플리케이션은 확장 가능한 솔루션에 대한 요구로 끝나는 경우가 많습니다.
.NET 1.1의 경우 https://web.archive.org/web/20211027113329/http ://aspnet.4guysfromrolla.com/articles/020707-1.aspx 문서를 참조하십시오.
참고: 위의 솔루션은 .NET 2.0에서도 작동합니다.
.NET 2.0 관련 솔루션은 https://web.archive.org/web/20210802144254/https ://aspnet.4guysfromrolla.com/articles/032807-1.aspx 문서를 참조하십시오.
섹션 핸들러를 사용하여 이 작업을 수행할 수 있습니다.http://www.codeproject.com/KB/aspnet/ConfigSections.aspx 에서 작성하는 방법에 대한 기본적인 개요가 있지만 app.config를 참조하면 web.config에서 사용하기 위해 작성하는 것과 거의 같습니다.이렇게 하면 기본적으로 구성 파일에 사용자 고유의 XML 트리가 있고 고급 구성을 수행할 수 있습니다.
제가 찾은 가장 간단한 방법은 앱 설정 섹션을 사용하는 것입니다.
Web.config에 다음을 추가합니다.
<appSettings> <add key="MyProp" value="MyVal"/> </appSettings>
코드에서 액세스
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
'programing' 카테고리의 다른 글
Oracle Floats 대 (0) | 2023.06.22 |
---|---|
git merge: 다른 파일로 이동한 코드에 변경 사항 적용 (0) | 2023.06.22 |
keyHolder.getKey()가 null을 반환합니다. (0) | 2023.06.22 |
unix 및 mysql을 사용하여 wordpress 덤프(.wxr) 만들기 (0) | 2023.06.22 |
Mongodb 집계 파이프라인 그룹 푸시를 제한하는 방법 (0) | 2023.06.22 |