programing

.NET 설정(app.config/web.config/settings).설정)

mailnote 2023. 4. 21. 21:11
반응형

.NET 설정(app.config/web.config/settings).설정)

가 있습니다.디버깅 빌드 및 릴리스 빌드용 컨피규레이션파일이 다른 NET 응용 프로그램.예를 들어 debug app.config 파일은 디버깅이 활성화된 개발 SQL Server를 가리키고 릴리스 대상은 라이브 SQL Server를 가리킵니다.디버깅/릴리스에서 다른 설정도 있습니다.

현재 두 개의 개별 구성 파일(debug.app.config 및 release.app.config)을 사용하고 있습니다.이 프로젝트의 빌드 이벤트가 있습니다.릴리스 빌드일 경우 release.app.config를 app.config에 복사하고 그렇지 않을 경우 debug.app.config를 app.config에 복사합니다.

문제는 응용 프로그램이 설정에서 설정을 가져오는 것처럼 보인다는 것입니다.설정 파일을 열어야 합니다.Visual Studio의 설정을 선택하면 설정이 변경되었음을 알리는 메시지가 표시되므로 변경 사항을 수락하고 설정을 저장합니다.올바른 설정을 사용하려면 재구축해야 합니다.

유사한 효과를 얻기 위해 더 나은/추천/추천되는 방법이 있습니까?아니면 마찬가지로 제가 완전히 잘못 접근한 것일까요? 더 나은 접근법이 있을까요?

환경에 따라 다를 수 있는 구성은 애플리케이션 수준이 아닌 시스템 수준에 저장해야 합니다(구성 수준에 대한 자세한 정보).

일반적으로 머신레벨에 격납하는 설정 요소는 다음과 같습니다.

환경(개발자, 통합, 테스트, 스테이지, 라이브)에 c:\Windows\Microsoft 고유의 설정이 있는 경우.NET\Framework64\v2.0.50727\CONFIG 디렉토리를 사용하면 빌드 후 수정 없이 환경 간에 애플리케이션 코드를 승격할 수 있습니다.

컴퓨터 레벨의 CONFIG 디렉토리의 컨텐츠는, 사용의 앱과는 다른 저장소 또는 다른 폴더 구조로 버전 제어됩니다.configSource를 인텔리전트하게 사용함으로써 .config 파일을 보다 쉽게 소스 제어 할 수 있습니다.

7년 동안 200개가 넘는 ASP에서 이 일을 해왔습니다.25개 이상의 기업에서 NET 애플리케이션 제공.(자랑하려는 것이 아니라 이 방법이 효과가 없는 상황을 본 적이 없다는 것을 알려드리고 싶습니다.)

이것은 설정을 다루는 일부 사용자에게 도움이 될 수 있습니다.설정 및 App.config:[설정(Settings)]의 값을 편집하는 동안 [속성(Properties)]페인의 [GenerateDefaultValueInCode]속성에 주의해 주세요.Visual Studio의 설정 그리드(내 경우는 Visual Studio 2008).

GenerateDefaultValueInCode를 True로 설정하면(여기에서는 True가 기본값입니다!), 기본값은 EXE(또는 DLL)로 컴파일되어 일반 텍스트에디터로 열면 파일에 포함되어 있습니다.

콘솔 어플리케이션에서 작업하고 있었는데 EXE에서 디폴트로 설정되어 있으면 어플리케이션은 항상 같은 디렉토리에 있는 Configuration파일을 무시합니다.정말 악몽같고 인터넷 전체에는 이것에 대한 정보가 없다.

여기에 관련된 질문이 있습니다.

빌드 프로세스의 개선

설정 파일에는 설정을 덮어쓸 수 있는 방법이 포함되어 있습니다.

<appSettings file="Local.config">

2개 이상의 파일을 체크 인하는 대신 기본 설정 파일만 체크 인하고 각 타깃머신에는 Local.config를 추가합니다.이 때 특정 머신에 대한 오버라이드가 있는 appSettings 섹션만 사용합니다.

config 섹션을 사용하는 경우 다음과 같습니다.

configSource="Local.config"

물론 Local.config 파일의 모든 백업 복사본을 다른 머신에서 만들어 어딘가에 체크인하는 것이 좋습니다.실제 솔루션의 일부로서가 아닙니다.각 개발자는 Local.config 파일에 "무시"를 붙여 체크인하지 않고 다른 모든 사용자의 파일을 덮어씁니다.

(실제로 "Local.config"라고 부를 필요는 없습니다.그게 바로 제가 사용하는 것입니다)

제가 읽어본 바로는 빌드 프로세스에 Visual Studio를 사용하고 계신 것 같습니다.대신 MSBuild와 Nant를 사용하는 것을 생각해 보셨습니까?

Nant의 xml 구문은 조금 이상하지만 일단 이해하면 당신이 말한 것을 실행하는 것은 매우 간단해집니다.

<target name="build">
    <property name="config.type" value="Release" />

    <msbuild project="${filename}" target="Build" verbose="true" failonerror="true">
        <property name="Configuration" value="${config.type}" />
    </msbuild>

    <if test="${config.type == 'Debug'}">
        <copy file=${debug.app.config}" tofile="${app.config}" />
    </if>

    <if test="${config.type == 'Release'}">
        <copy file=${release.app.config}" tofile="${app.config}" />
    </if>

</target>

Visual Studio 2005 Web Deployment Projects의 혜택을 받을 수 있을 것 같습니다.

이를 통해 빌드 구성에 따라 web.config 파일의 섹션을 업데이트/변경하도록 지시할 수 있습니다.

Scott Gu의 블로그 엔트리를 보고 간단한 개요/샘플을 참조하십시오.

이전에는 Web Deployment 프로젝트를 사용했지만, 이후 NANT로 이행했습니다.현재 다른 설정 파일을 분기 및 복사하는 대신 구성 값을 빌드 스크립트에 직접 삽입하고 xmlpoke 태스크를 통해 구성 파일에 삽입합니다.

  <xmlpoke
    file="${stagingTarget}/web.config"
    xpath="/configuration/system.web/compilation/@debug"
    value="true"
  />

어느 경우든 컨피규레이션파일은 원하는 개발자 값을 모두 가질 수 있으며 개발 환경 내에서 운영 시스템을 중단하지 않고 정상적으로 작동합니다.개발자가 테스트 시 빌드 스크립트 변수를 임의로 변경할 가능성이 적다는 것을 알 수 있었습니다.따라서 개발 값이 기본적으로 생성되지 않도록 프로세스 초기에 각 var를 추가해야 하지만 지금까지 시도했던 다른 기술보다 우발적인 잘못된 구성이 더 드물었습니다.

현재 고용주는 먼저 개발 수준(debug, stage, live 등)을 machine.config 파일에 저장함으로써 이 문제를 해결했습니다.그런 다음 코드를 작성하여 적절한 설정 파일을 사용합니다.이로 인해 앱 전개 후 잘못된 연결 문자열로 문제가 해결되었습니다.

이들은 최근 machine.config 값에서 올바른 연결 문자열을 반환하는 중앙 웹 서비스를 작성했습니다.

이게 최선의 해결책인가요?아마 아닐 거예요, 하지만 그들에게는 효과가 있어요.

그 중 하나가 Web Deployment Project를 사용한 것입니다.제 사이트에는 2/3개의 web.config 파일이 있습니다.게시 시 선택한 설정 모드(릴리스/스테이지 등)에 따라서는 Web 경유로 카피할 수 있습니다.AfterBuild 이벤트에서 web.config를 릴리스하고 이름을 web.config로 변경합니다.필요없는 것은 삭제합니다(Web).staging.config 등).

<Target Name="AfterBuild">
    <!--Web.config -->
    <Copy Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " SourceFiles="$(SourceWebPhysicalPath)\Web.Release.config" DestinationFiles="$(OutputPath)\Web.config" />
    <Copy Condition=" '$(Configuration)|$(Platform)' == 'Staging|AnyCPU' " SourceFiles="$(SourceWebPhysicalPath)\Web.Staging.config" DestinationFiles="$(OutputPath)\Web.config" />
    <!--Delete extra files -->
    <Delete Files="$(OutputPath)\Web.Release.config" />
    <Delete Files="$(OutputPath)\Web.Staging.config" />
    <Delete Files="@(ProjFiles)" />
  </Target>

ASP의 개발 환경/UAT 환경/프로덕트 환경 간에 구성을 전환하는 가장 좋은 방법은 다음과 같습니다.NET?:XSLT를 사용하여 web.config를 전송합니다.

NANT 사용에 대한 몇 가지 좋은 예도 있습니다.

프로젝트에서도 개발, QA, uat 및 prod 구성을 유지해야 했던 것과 같은 문제가 있었습니다.다음은 MSBuild에 익숙한 경우에만 해당됩니다.

MSBuild 커뮤니티 작업 확장과 함께 MSBuild를 사용합니다.여기에는 올바른 노드를 지정하면 XML 파일의 엔트리를 '매스업데이트'할 수 있는 'XmlMassUpdate' 태스크가 포함되어 있습니다.

구현 방법:

1) dev env 엔트리를 포함하는 Configuration파일이 1개 필요합니다.이것은 솔루션 내의 Configuration파일입니다.

2) 환경마다 다른(appSettings 및 ConnectionStrings) 엔트리만 포함하는 "Substitutions.xml" 파일이 필요합니다.환경 전체에서 변경되지 않는 항목은 이 파일에 넣을 필요가 없습니다.솔루션의 web.config 파일에 저장될 수 있으며 작업에 영향을 주지 않습니다.

3) 빌드 파일에서 XML 대량 업데이트 태스크를 호출하여 적절한 환경을 파라미터로 제공하기만 하면 됩니다.

아래의 예를 참조해 주세요.

    <!-- Actual Config File -->
    <appSettings>
        <add key="ApplicationName" value="NameInDev"/>
        <add key="ThisDoesNotChange" value="Do not put in substitution file" />
    </appSettings>

    <!-- Substitutions.xml -->
    <configuration xmlns:xmu="urn:msbuildcommunitytasks-xmlmassupdate">
      <substitutions>
        <QA>
           <appSettings>
            <add xmu:key="key" key="ApplicationName" value="NameInQA"/>
           </appSettings>            
        </QA>
        <Prod>
          <appSettings>
            <add xmu:key="key" key="ApplicationName" value="NameInProd"/>
          </appSettings>            
        </Prod>
     </substitutions>
    </configuration>


<!-- Build.xml file-->

    <Target Name="UpdateConfigSections">
            <XmlMassUpdate ContentFile="Path\of\copy\of\latest web.config" SubstitutionsFile="path\of\substitutionFile" ContentRoot="/configuration" SubstitutionsRoot="/configuration/substitutions/$(Environment)" />
        </Target>

구축하려는 환경에 따라 '$Environment'를 'QA' 또는 'Prod'로 바꿉니다.복구할 수 없는 오류가 발생하지 않도록 실제 설정 파일 자체가 아닌 설정 파일의 복사본으로 작업해야 합니다.

빌드 파일을 실행하고 업데이트된 구성 파일을 배포 환경으로 이동하기만 하면 됩니다.

상세한 것에 대하여는, 다음의 문서를 참조해 주세요.

http://blogs.microsoft.co.il/blogs/dorony/archive/2008/01/18/easy-configuration-deployment-with-msbuild-and-the-xmlmassupdate-task.aspx

사용자처럼 'multi' app.config - 예를 들어 app.configDEV, app.configTEST, app.config.config를 셋업했습니다.로컬입니다. 몇 가지 훌륭한 대안을 제안합니다. 하지만 이 방법이 마음에 드신다면 다음 사항을 추가해 드리겠습니다.

는 나나 a a a가 있다
<appSettings>
<add key = "Env" value = "[Local] "/>"Configuration Manager" "UI" "Configuration Manager" "UI" "Configuration Manager"Env ("Env");

단지, 목적의 설정으로 변경했을 뿐입니다.(4개의 evenioment에 대해 데이터베이스/WCF 구성이 많은 8개의 앱이 있는 프로젝트가 있습니다.)클릭 한 번으로 도입하려면 프로젝트에서 4개의 시팅을 변경하여 진행해야 합니다.(자동화하고 싶다)

이전 설정은 수동 이름 변경 후 "stuck"되므로 변경 후 "clean all"을 기억해야 합니다.(이것으로 설정을 고칠 수 있을 것 같습니다.설정 문제).

이것이 매우 잘 작동한다는 것을 알게 되었습니다(언젠가 MSBuild/NANT를 살펴볼 시간이 생길 것입니다).

Web.config:

Web.config 는, IIS 로 애플리케이션을 호스트 하는 경우에 필요합니다.Web.config는 IIS가 Kestrel 앞에서 리버스 프록시로서 동작하는 방법을 설정하기 위한 필수 설정 파일입니다.IIS에서 web.config를 호스트하려면 web.config를 유지해야 합니다.

AppSetting.json:

IIS와 관계없는 다른 모든 것에 대해서는 AppSetting.json을 사용합니다.AppSetting.json은 ASP에 사용됩니다.넷코어 호스팅ASP.NET Core는 "ASPNETCORE_ENVironment" 환경변수를 사용하여 현재 환경을 확인합니다.기본적으로는 이 값을 설정하지 않고 응용 프로그램을 실행하면 운영 환경이 자동으로 기본 설정되고 "AppSetting.production.json" 파일이 사용됩니다.Visual Studio를 통해 디버깅하면 환경이 "AppSetting.json"을 사용하도록 개발로 설정됩니다.Windows 에서 호스트 환경 변수를 설정하는 방법에 대해서는, 이 Web 사이트를 참조해 주세요.

App.config:

App.config는 에서 사용되는 다른 설정 파일입니다.주로 Windows Forms, Windows Services, Console Apps 및 WPF 응용 프로그램에 사용됩니다.ASP를 시작할 때.콘솔 어플리케이션 app.config를 통한 Net Core 호스팅도 사용됩니다.


TL;DR

컨피규레이션파일 선택은 서비스에 대해 선택한 호스팅 환경에 따라 결정됩니다.IIS를 사용하여 서비스를 호스트하는 경우 Web.config 파일을 사용합니다.다른 호스팅 환경을 사용하는 경우 App.config 파일을 사용합니다.Configuration Files를 사용한 서비스 구성 설명서를 참조하십시오. ASP의 Configuration도 확인하십시오.NET 코어

위에는 asp.net 라고 되어 있는데, 설정을 데이터베이스에 저장하고 커스텀 캐시를 사용하여 취득하는 것은 어떻습니까?

그 이유는 프로덕션 파일을 지속적으로 업데이트할 수 있는 권한을 얻는 것보다 데이터베이스를 지속적으로 업데이트하는 것이 더 쉽기 때문입니다.

커스텀 캐시의 예:

public enum ConfigurationSection
{
    AppSettings
}

public static class Utility
{
    #region "Common.Configuration.Configurations"

    private static Cache cache = System.Web.HttpRuntime.Cache;

    public static String GetAppSetting(String key)
    {
        return GetConfigurationValue(ConfigurationSection.AppSettings, key);
    }

    public static String GetConfigurationValue(ConfigurationSection section, String key)
    {
        Configurations config = null;

        if (!cache.TryGetItemFromCache<Configurations>(out config))
        {
            config = new Configurations();
            config.List(SNCLavalin.US.Common.Enumerations.ConfigurationSection.AppSettings);
            cache.AddToCache<Configurations>(config, DateTime.Now.AddMinutes(15));
        }

        var result = (from record in config
                      where record.Key == key
                      select record).FirstOrDefault();

        return (result == null) ? null : result.Value;
    }

    #endregion
}

namespace Common.Configuration
{
    public class Configurations : List<Configuration>
    {
        #region CONSTRUCTORS

        public Configurations() : base()
        {
            initialize();
        }
        public Configurations(int capacity) : base(capacity)
        {
            initialize();
        }
        public Configurations(IEnumerable<Configuration> collection) : base(collection)
        {
            initialize();
        }

        #endregion

        #region PROPERTIES & FIELDS

        private Crud _crud; // Db-Access layer

        #endregion

        #region EVENTS
        #endregion

        #region METHODS

        private void initialize()
        {
            _crud = new Crud(Utility.ConnectionName);
        }

        /// <summary>
        /// Lists one-to-many records.
        /// </summary>
        public Configurations List(ConfigurationSection section)
        {
            using (DbCommand dbCommand = _crud.Db.GetStoredProcCommand("spa_LIST_MyConfiguration"))
            {
                _crud.Db.AddInParameter(dbCommand, "@Section", DbType.String, section.ToString());

                _crud.List(dbCommand, PopulateFrom);
            }

            return this;
        }

        public void PopulateFrom(DataTable table)
        {
            this.Clear();

            foreach (DataRow row in table.Rows)
            {
                Configuration instance = new Configuration();
                instance.PopulateFrom(row);
                this.Add(instance);
            }
        }

        #endregion
    }

    public class Configuration
    {
        #region CONSTRUCTORS

        public Configuration()
        {
            initialize();
        }

        #endregion

        #region PROPERTIES & FIELDS

        private Crud _crud;

        public string Section { get; set; }
        public string Key { get; set; }
        public string Value { get; set; }

        #endregion

        #region EVENTS
        #endregion

        #region METHODS

        private void initialize()
        {
            _crud = new Crud(Utility.ConnectionName);
            Clear();
        }

        public void Clear()
        {
            this.Section = "";
            this.Key = "";
            this.Value = "";
        }
        public void PopulateFrom(DataRow row)
        {
            Clear();

            this.Section = row["Section"].ToString();
            this.Key = row["Key"].ToString();
            this.Value = row["Value"].ToString();
        }

        #endregion
    }
}

언급URL : https://stackoverflow.com/questions/132544/net-configuration-app-config-web-config-settings-settings

반응형