Web.Config 디버그 / 릴리스


82

Visual Studio 2010의 web.config가 데이터베이스에서 디버그 모드에서 릴리스 모드로 전환하는 기능을 제공한다는 것을 알고 있습니다.

내 Web.Release.config는 다음과 같습니다.

<?xml version="1.0"?>

<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

  <connectionStrings>
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
      providerName="System.Data.SqlClient" />
    <add name="Testing1" connectionString="Data Source=test;Initial Catalog=TestDatabase;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>

</configuration>

내 Web.Debug.config 코드는 다음과 같습니다.

<?xml version="1.0"?>

<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

  <connectionStrings>
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
      providerName="System.Data.SqlClient" />
    <add name="Live1" connectionString="Data Source=Live;Initial Catalog=LiveDatabase;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>

  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
  </system.web>

</configuration>

그리고 이것은 내 Web.config 코드입니다.

<?xml version="1.0"?>

<!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=169433 -->
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />

    <authentication mode="Forms">
       <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
    </authentication>

    <membership>
       <providers>
          <clear/>
          <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="/" />
       </providers>
    </membership>

    <profile>
       <providers>
          <clear/>
          <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
       </providers>
    </profile>

    <roleManager enabled="false">
       <providers>
          <clear/>
          <add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="ApplicationServices" applicationName="/" />
    <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
       </providers>
    </roleManager>

  </system.web>

  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

내 프로젝트를 게시 할 때 Web.config 파일에 아무것도 표시되지 않습니다. 내 라이브 데이터베이스 연결 문자열이 표시되지 않습니까?

답변:


131

Visual Studio 2010의 일부인 web.config 변환은 현재 web.config 파일을 .Debug 또는 .Release 버전으로 "변환"하기 위해 XSLT를 사용합니다.

.Debug / .Release 파일에서 연결 문자열 필드에 다음 매개 변수를 추가해야합니다.

xdt:Transform="SetAttributes" xdt:Locator="Match(name)"

이렇게하면 각 연결 문자열 줄이 일치하는 이름을 찾고 그에 따라 속성을 업데이트합니다.

참고 : 변환 파일에서 providerName 매개 변수는 변경되지 않으므로 업데이트에 대해 걱정할 필요가 없습니다.

다음은 내 앱 중 하나의 예입니다. 다음은 web.config 파일 섹션입니다.

<connectionStrings>
      <add name="EAF" connectionString="[Test Connection String]" />
</connectionString>

다음은 적절한 변환을 수행하는 web.config.release 섹션입니다.

<connectionStrings>
      <add name="EAF" connectionString="[Prod Connection String]"
           xdt:Transform="SetAttributes"
           xdt:Locator="Match(name)" />
</connectionStrings>

추가 된 한 가지 참고 : 변환은 사이트를 게시 할 때만 발생하며 F5 또는 CTRL + F5를 사용하여 실행하는 경우에만 발생합니다. 특정 구성에 대해 로컬로 업데이트를 실행해야하는 경우이를 위해 Web.config 파일을 수동으로 변경해야합니다.

자세한 내용은 MSDN 설명서를 참조하십시오.

https://msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx


20
답변에 F5 시간이 아닌 게시 ​​시간에 발생한다는 메모를 추가 할 수 있습니까? 분명히 나는 ​​2 시간 동안 이것을 맞았지만 그것을 깨닫지 못했습니다.
Paul

Visual Studio Online Continuous Build에서이 작업을 수행하려면 어떻게해야합니까? 빌드 및 Azure에 배포하는 동안 내 Web.Config를 변환하고 싶습니다.
Rosdi Kasim

1
@RosdiKasim-이것이 Visual Studio 온라인에서 100 % 일치하는지 확실하지 않지만 특정 프로젝트를 배포해야하거나 (여러 개가있는 경우) 다른 빌드를 사용 (따라서 변환)해야 할 때 직접 지정합니다. Azure 웹 사이트 인스턴스. 여기에 그 동안의 뒷면에 쓴 몇 가지 세부 사항입니다 : freshconsulting.com/...은
Dillie-O

여기에 자세한 내용을 설명하는 MSDN 링크가 있습니다. msdn.microsoft.com/en-us/library/dd465326(VS.100).aspx
Hakan Fıstık

1
F5를 통해 VS에서 사이트를 실행하는 것과 게시하는 것에 대한 추가 메모는 나에게 매우 도움이되었습니다.
Denis M. Kitchen

8

그것은 사용 가능 ConfigTransform- Nuget 패키지로 제공 빌드 타겟 https://www.nuget.org/packages/CodeAssassin.ConfigTransform/을

모든 "web. * .config"변환 파일은 선택한 빌드 구성에 관계없이 빌드 출력 디렉토리에 일련의 "web. *. config.transformed"파일로 변환 및 출력됩니다.

웹이 아닌 프로젝트의 "app. *. config"변환 파일에도 동일하게 적용됩니다.

다음 대상을 *.csproj.

<Target Name="TransformActiveConfiguration" Condition="Exists('$(ProjectDir)/Web.$(Configuration).config')" BeforeTargets="Compile" >
    <TransformXml Source="$(ProjectDir)/Web.Config" Transform="$(ProjectDir)/Web.$(Configuration).config" Destination="$(TargetDir)/Web.config" />
</Target>

주제에 대해 Google에 나타나는 첫 번째 Stackoverflow 게시물이므로 답변을 게시합니다.


이 훌륭한 방법은 저에게 매우 효과적 이었지만 언급 한 ConfigTransform (항상 모든 구성을 변환 함)을 설치할 필요가 없었습니다. Visual Studio에서 활성 빌드 구성을 설정하고 (예 : 디버그로 변경) 솔루션을 빌드하고 짜잔!
BornToCode

5

개발에서 변환이 작동하도록하려면 (F5 또는 CTRL + F5 사용) ctt.exe ( https://ctt.codeplex.com/ )를 패키지 폴더 (packages \ ConfigTransform \ ctt.exe)에 놓습니다.

그런 다음 Visual Studio에서 사전 또는 사후 빌드 이벤트를 등록합니다.

$(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)connectionStrings.config" transform:"$(ProjectDir)connectionStrings.$(ConfigurationName).config" destination:"$(ProjectDir)connectionStrings.config"
$(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)web.config" transform:"$(ProjectDir)web.$(ConfigurationName).config" destination:"$(ProjectDir)web.config"

변환의 경우 SlowCheeta VS 확장 ( https://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5 )을 사용합니다.


1
공백을 보존하려면 (변환 된 구성이 한 줄에있는 것을 방지) preservewhitespace indentChars : ""를 명령 줄에 추가합니다. $(SolutionDir)packages\ConfigTransform\ctt.exe source:"$(ProjectDir)connectionStrings.config" transform:"$(ProjectDir)connectionStrings.$(ConfigurationName).config" destination:"$(ProjectDir)connectionStrings.config" preservewhitespace indent IndentChars:" "
엠마누엘 닐슨

3

당신의 교체하려는 경우 연결 문자열의 모든 생산 환경에 대한 뉴스 사람과를, 당신은 단순히이 구문을 사용하여 생산 사람과의 모든 연결 문자열을 대체 할 수있다 :

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

<connectionStrings xdt:Transform="Replace">
    <!-- production environment config --->
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
      providerName="System.Data.SqlClient" />
    <add name="Testing1" connectionString="Data Source=test;Initial Catalog=TestDatabase;Integrated Security=True"
      providerName="System.Data.SqlClient" />
</connectionStrings>
....

이 답변에 대한 정보에서 가져온되는 이 답변 하고 이 블로그 게시물 .

주의 사항 : 다른 사람들이 이미 설명했듯이이 설정은 응용 프로그램을 실행 / 디버깅 할 때가 아니라 (F5 키를 눌러) 게시 할 때만 적용됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.