다음을 통해 공유


웹 배포를 통해 웹 애플리케이션을 오프라인으로 전환

작성자 : Jason Lee

이 항목에서는 IIS(인터넷 정보 서비스) 웹 배포 도구(웹 배포)를 사용하여 자동화된 배포 기간 동안 웹 애플리케이션을 오프라인으로 만드는 방법을 설명합니다. 웹 애플리케이션으로 이동하는 사용자는 배포가 완료될 때까지 App_offline.htm 파일로 리디렉션됩니다.

이 항목은 Fabrikam, Inc.라는 가상 회사의 엔터프라이즈 배포 요구 사항을 기반으로 하는 일련의 자습서의 일부를 구성합니다. 이 자습서 시리즈에서는 샘플 솔루션인 Contact Manager 솔루션을 사용하여 ASP.NET MVC 3 애플리케이션, WCF(Windows Communication Foundation) 서비스 및 데이터베이스 프로젝트를 포함하여 현실적인 수준의 복잡성을 가진 웹 애플리케이션을 나타냅니다.

이 자습서의 핵심인 배포 방법은 프로젝트 파일 이해에 설명된 분할 프로젝트 파일 접근 방식을 기반으로 합니다. 이 방법은 빌드 프로세스가 모든 대상 환경에 적용되는 빌드 지침과 환경별 빌드 및 배포 설정을 포함하는 두 개의 프로젝트 파일에 의해 제어됩니다. 빌드 시 환경별 프로젝트 파일이 환경에 구애받지 않은 프로젝트 파일로 병합되어 전체 빌드 지침 집합을 형성합니다.

작업 개요

많은 시나리오에서 데이터베이스 또는 웹 서비스와 같은 관련 구성 요소를 변경하는 동안 웹 애플리케이션을 오프라인으로 전환하려고 합니다. 일반적으로 IIS 및 ASP.NET IIS 웹 사이트 또는 웹 애플리케이션의 루트 폴더에 App_offline.htm 라는 파일을 배치하여 이 작업을 수행합니다. App_offline.htm 파일은 표준 HTML 파일이며 일반적으로 유지 관리로 인해 사이트를 일시적으로 사용할 수 없음을 사용자에게 알리는 간단한 메시지가 포함됩니다. App_offline.htm 파일이 웹 사이트의 루트 폴더에 있는 동안 IIS는 자동으로 모든 요청을 파일로 리디렉션합니다. 업데이트를 완료하면 App_offline.htm 파일을 제거하고 웹 사이트에서 평소와 같이 요청 제공을 다시 시작합니다.

웹 배포를 사용하여 대상 환경에 대한 자동화된 배포 또는 단일 단계 배포를 수행하는 경우 배포 프로세스에 App_offline.htm 파일 추가 및 제거를 통합할 수 있습니다. 이렇게 하려면 다음과 같은 상위 수준 작업을 완료해야 합니다.

  • 배포 프로세스를 제어하는 데 사용하는 Microsoft Build Engine(MSBuild) 프로젝트 파일에서 배포 작업이 시작되기 전에 대상 서버에App_offline.htm 파일을 복사하는 MSBuild 대상을 만듭니다.
  • 모든 배포 작업이 완료되면 대상 서버에서 App_offline.htm 파일을 제거하는 다른 MSBuild 대상을 추가합니다.
  • 웹 애플리케이션 프로젝트에서 웹 배포가 호출될 때 App_offline.htm 파일이 배포 패키지에 추가되도록 하는 .wpp.targets 파일을 만듭니다.

이 항목에서는 이러한 절차를 수행하는 방법을 보여 줍니다. 이 항목의 작업 및 연습에서는 하나 이상의 웹 애플리케이션 프로젝트가 포함된 솔루션을 이미 만들었으며 엔터프라이즈의 웹 배포에 설명된 대로 사용자 지정 프로젝트 파일을 사용하여 배포 프로세스를 제어한다고 가정합니다. 또는 Contact Manager 샘플 솔루션을 사용하여 항목의 예제를 따를 수 있습니다.

웹 애플리케이션 프로젝트에 App_Offline 파일 추가

완료해야 하는 첫 번째 작업은 웹 애플리케이션 프로젝트에 App_offline 파일을 추가하는 것입니다.

  • 파일이 개발 프로세스를 방해하지 않도록 하려면(애플리케이션이 영구적으로 오프라인 상태가 되지 않도록) App_offline.htm이외의 다른 항목으로 호출해야 합니다. 예를 들어 파일 이름을 로App_offline-template.htm수 있습니다.
  • 파일이 있는 그대로 배포되지 않도록 하려면 빌드 작업을 없음으로 설정해야 합니다.

웹 애플리케이션 프로젝트에 App_offline 파일을 추가하려면

  1. Visual Studio 2010에서 솔루션을 엽니다.

  2. 솔루션 탐색기 창에서 웹 애플리케이션 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 새 항목을 클릭합니다.

  3. 새 항목 추가 대화 상자에서 HTML 페이지를 선택합니다.

  4. 이름 상자에 App_offline-template.htm입력한 다음 추가를 클릭합니다.

    이름 상자에 App_offline-template.htm 입력한 다음 추가를 클릭합니다.

  5. 간단한 HTML을 추가하여 사용자에게 애플리케이션을 사용할 수 없음을 알리고 파일을 저장합니다. 서버 쪽 태그를 포함하지 마세요(예: 접두사로 "asp:"가 접두사인 태그).

    사용자에게 애플리케이션을 사용할 수 없음을 알리는 간단한 H TM L을 추가한 다음 파일을 저장합니다.

  6. 솔루션 탐색기 창에서 새 파일을 마우스 오른쪽 단추로 클릭한 다음 속성을 클릭합니다.

  7. 속성 창의 빌드 작업 행에서 없음을 선택합니다.

    속성 창 빌드 작업 행에서 없음을 선택합니다.

App_Offline 파일 배포 및 삭제

다음 단계는 배포 프로세스를 시작할 때 대상 서버에 파일을 복사하고 마지막에 제거하도록 배포 논리를 수정하는 것입니다.

참고

다음 절차에서는 프로젝트 파일 이해에 설명된 대로 사용자 지정 MSBuild 프로젝트 파일을 사용하여 배포 프로세스를 제어한다고 가정합니다. Visual Studio에서 직접 배포하는 경우 다른 방법을 사용해야 합니다. Sayed Ibrahim Hashimi는 게시하는 동안 웹앱을 오프라인으로 전환하는 방법에서 이러한 접근 방식 중 하나를 설명합니다.

대상 IIS 웹 사이트에 App_offline 파일을 배포하려면 웹 배포 contentPath 공급자를 사용하여 MSDeploy.exe 호출해야 합니다. contentPath 공급자는 물리적 디렉터리 경로와 IIS 웹 사이트 또는 애플리케이션 경로를 모두 지원하므로 Visual Studio 프로젝트 폴더와 IIS 웹 애플리케이션 간에 파일을 동기화하는 데 적합합니다. 파일을 배포하려면 MSDeploy 명령이 다음과 유사해야 합니다.

msdeploy.exe –verb:sync
             -source:contentPath="[Project folder]\App_offline.template.htm"
             -dest:contentPath="[IIS application path]/App_offline.htm",
              computerName="[Destination web server]"

배포 프로세스가 끝날 때 대상 사이트에서 파일을 제거하려면 MSDeploy 명령이 다음과 유사해야 합니다.

msdeploy.exe –verb:delete
             -dest:contentPath="[IIS application path]/App_offline.htm",
              computerName="[Destination web server]"

이러한 명령을 빌드 및 배포 프로세스의 일부로 자동화하려면 사용자 지정 MSBuild 프로젝트 파일에 통합해야 합니다. 다음 절차에서는 이 작업을 수행하는 방법을 설명합니다.

App_offline 파일을 배포하고 삭제하려면

  1. Visual Studio 2010에서 배포 프로세스를 제어하는 MSBuild 프로젝트 파일을 엽니다. Contact Manager 샘플 솔루션에서 Publish.proj 파일입니다.

  2. 루트 Project 요소에서 새 PropertyGroup 요소를 만들어 App_offline 배포에 대한 변수를 저장합니다.

    <PropertyGroup>
      <AppOfflineTemplateFilename   
        Condition=" '$(AppOfflineTemplateFilename)'=='' ">
          app_offline-template.htm
      </AppOfflineTemplateFilename>
      <AppOfflineSourcePath 
        Condition=" '$(AppOfflineSourcePath)'==''">
          $(SourceRoot)ContactManager.Mvc\$(AppOfflineTemplateFilename)
      </AppOfflineSourcePath>
    </PropertyGroup>
    
  3. SourceRoot 속성은 Publish.proj 파일의 다른 곳에서 정의됩니다. 즉, Publish.proj 파일의 위치를 기준으로 현재 경로를 기준으로 원본 콘텐츠의 루트 폴더 위치를 나타냅니다.

  4. contentPath 공급자는 상대 파일 경로를 허용하지 않으므로 원본 파일에 대한 절대 경로를 가져와야 배포할 수 있습니다. ConvertToAbsolutePath 작업을 사용하여 이 작업을 수행할 수 있습니다.

  5. GetAppOfflineAbsolutePath라는 새 Target 요소를 추가합니다. 이 대상 내에서 ConvertToAbsolutePath 작업을 사용하여 프로젝트 폴더의 App_offline 템플릿 파일에 대한 절대 경로를 가져옵니다.

    <Target Name="GetAppOfflineAbsolutePath" BeforeTargets="DeployAppOffline">
      <ConvertToAbsolutePath Paths="$(AppOfflineSourcePath)">
        <Output TaskParameter="AbsolutePaths"       
                PropertyName="AppOfflineAbsoluteSourcePath" />
      </ConvertToAbsolutePath>
    </Target>
    
  6. 이 대상은 프로젝트 폴더의 App_offline 템플릿 파일에 대한 상대 경로를 가져와서 새 속성에 절대 파일 경로로 저장합니다. BeforeTargets 특성은 다음 단계에서 만들 DeployAppOffline 대상 앞에 이 대상을 실행하도록 지정합니다.

  7. DeployAppOffline이라는 새 대상을 추가합니다. 이 대상 내에서 대상 웹 서버에 App_offline 파일을 배포하는 MSDeploy.exe 명령을 호출합니다.

    <Target Name="DeployAppOffline" 
            Condition=" '$(EnableAppOffline'!='false' ">
      <PropertyGroup> 
        <_Cmd>"$(MSDeployPath)\msdeploy.exe" -verb:sync 
               -source:contentPath="$(AppOfflineAbsoluteSourcePath)" 
               -dest:contentPath="$(ContactManagerIisPath)/App_offline.htm",
                computerName="$(MSDeployComputerName)"
        </_Cmd>
      </PropertyGroup>
      <Exec Command="$(_Cmd)"/> 
    </Target>
    
  8. 이 예제에서 ContactManagerIisPath 속성은 프로젝트 파일의 다른 곳에서 정의됩니다. 이는 단순히 [IIS 웹 사이트 이름]/[애플리케이션 이름] 형식의 IIS 애플리케이션 경로입니다. 대상에 조건을 포함하면 사용자가 속성 값을 변경하거나 명령줄 매개 변수를 제공하여 App_offline 배포를 켜거나 끌 수 있습니다.

  9. DeleteAppOffline이라는 새 대상을 추가합니다. 이 대상 내에서 대상 웹 서버에서 App_offline 파일을 제거하는 MSDeploy.exe 명령을 호출합니다.

    <Target Name="DeleteAppOffline" 
            Condition=" '$(EnableAppOffline'!='false' ">
      <PropertyGroup> 
        <_Cmd>"$(MSDeployPath)\msdeploy.exe" -verb:delete 
               -dest:contentPath="$(ContactManagerIisPath)/App_offline.htm",
                computerName="$(MSDeployComputerName)"
        </_Cmd>
      </PropertyGroup>
      <Exec Command="$(_Cmd)"/> 
    </Target>
    
  10. 최종 작업은 프로젝트 파일을 실행하는 동안 적절한 지점에서 이러한 새 대상을 호출하는 것입니다. 다양한 방법으로 이 작업을 수행할 수 있습니다. 예를 들어 Publish.proj 파일에서 FullPublishDependsOn 속성은 FullPublish 기본 대상이 호출될 때 순서대로 실행해야 하는 대상 목록을 지정합니다.

  11. MSBuild 프로젝트 파일을 수정하여 게시 프로세스의 적절한 지점에서 DeployAppOfflineDeleteAppOffline 대상을 호출합니다.

    <PropertyGroup>
      <FullPublishDependsOn>
        Clean;
        BuildProjects; 
        DeployAppOffline;
        GatherPackagesForPublishing;
        PublishDbPackages;
        DeployTestDBPermissions;
        PublishWebPackages;
        DeleteAppOffline;
      </FullPublishDependsOn> 
    </PropertyGroup>
    <Target Name="FullPublish" DependsOnTargets="$(FullPublishDependsOn)" />
    

사용자 지정 MSBuild 프로젝트 파일을 실행하면 App_offline 파일이 성공적으로 빌드된 직후 서버에 배포됩니다. 그런 다음 모든 배포 작업이 완료되면 서버에서 삭제됩니다.

배포 패키지에 App_Offline 파일 추가

배포를 구성하는 방법에 따라 대상 IIS 웹 애플리케이션의 기존 콘텐츠( 예:App_offline.htm 파일)는 대상에 웹 패키지를 배포할 때 자동으로 삭제될 수 있습니다. 배포 기간 동안 App_offline.htm 파일이 그대로 유지되도록 하려면 배포 프로세스 시작 시 파일을 직접 배포하는 것 외에도 웹 배포 패키지 자체에 파일을 포함해야 합니다.

  • 이 항목의 이전 작업을 수행한 경우 다른 파일 이름( App_offline-template.htm 사용)으로 웹 애플리케이션 프로젝트에 App_offline.htm파일을 추가했으며 빌드 작업을 없음으로 설정했습니다. 이러한 변경은 파일이 개발 및 디버깅을 방해하지 않도록 하는 데 필요합니다. 따라서 App_offline.htm 파일이 웹 배포 패키지에 포함되도록 패키징 프로세스를 사용자 지정해야 합니다.

WPP(웹 게시 파이프라인)는 FilesForPackagingFromProject 라는 항목 목록을 사용하여 웹 배포 패키지에 포함해야 하는 파일 목록을 빌드합니다. 이 목록에 고유한 항목을 추가하여 웹 패키지의 콘텐츠를 사용자 지정할 수 있습니다. 이렇게 하려면 다음 상위 수준 단계를 완료해야 합니다.

  1. 프로젝트 파일과 동일한 폴더에 [프로젝트 이름].wpp.targets 라는 사용자 지정 프로젝트 파일을 만듭니다.

    참고

    .wpp.targets 파일은 빌드 및 배포 프로세스를 제어하는 데 사용하는 사용자 지정 프로젝트 파일과 동일한 폴더가 아니라 웹 애플리케이션 프로젝트 파일과 동일한 폴더(예: ContactManager.Mvc.csproj)로 이동해야 합니다.

  2. .wpp.targets 파일에서 CopyAllFilesToSingleFolderForPackage 대상 이전에 실행되는 새 MSBuild 대상을 만듭니다. 패키지에 포함할 항목 목록을 작성하는 WPP 대상입니다.

  3. 새 대상에서 ItemGroup 요소를 만듭니다.

  4. ItemGroup 요소에서 FilesForPackagingFromProject 항목을 추가하고 App_offline.htm 파일을 지정합니다.

.wpp.targets 파일은 다음과 유사합니다.

<Project ToolsVersion="4.0" 
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="AddAppOfflineToPackage"
          BeforeTargets="CopyAllFilesToSingleFolderForPackage">
    <ItemGroup>   
      <FilesForPackagingFromProject Include="App_offline-template.htm">
        <DestinationRelativePath>App_offline.htm</DestinationRelativePath>
    </FilesForPackagingFromProject>
  </ItemGroup>
  </Target>
</Project>

다음은 이 예제의 핵심 사항입니다.

  • BeforeTargets 특성은 CopyAllFilesToSingleFolderForPackage 대상 바로 앞에 실행되도록 지정하여 이 대상을 WPP에 삽입합니다.
  • FilesForPackagingFromProject 항목은 DestinationRelativePath 메타데이터 값을 사용하여 파일에 추가되는 App_offline-template.htmApp_offline.htm 파일의 이름을 바꿉니다.

다음 절차에서는 이 .wpp.targets 파일을 웹 애플리케이션 프로젝트에 추가하는 방법을 보여 줍니다.

웹 배포 패키지에 .wpp.targets 파일을 추가하려면

  1. Visual Studio 2010에서 솔루션을 엽니다.

  2. 솔루션 탐색기 창에서 웹 애플리케이션 프로젝트 노드(예: ContactManager.Mvc)를 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 새 항목을 클릭합니다.

  3. 새 항목 추가 대화 상자에서 XML 파일 템플릿을 선택합니다.

  4. 이름 상자에 [프로젝트 이름].wpp.targets(예: ContactManager.Mvc.wpp.targets)를 입력하고 추가를 클릭합니다.

    이름 상자에 프로젝트 이름 .wpp.targets를 입력한 다음 추가를 클릭합니다.

    참고

    프로젝트의 루트 노드에 새 항목을 추가하면 파일이 프로젝트 파일과 동일한 폴더에 만들어집니다. Windows Explorer 폴더를 열어 이를 확인할 수 있습니다.

  5. 파일에서 앞에서 설명한 MSBuild 태그를 추가합니다.

    <Project ToolsVersion="4.0" 
             xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <Target Name="AddAppOfflineToPackage"
              BeforeTargets="CopyAllFilesToSingleFolderForPackage">
        <ItemGroup>   
          <FilesForPackagingFromProject Include="App_offline-template.htm">
            <DestinationRelativePath>App_offline.htm</DestinationRelativePath>
        </FilesForPackagingFromProject>
      </ItemGroup>
      </Target>
    </Project>
    
  6. [프로젝트 이름].wpp.targets 파일을 저장하고 닫습니다.

다음에 웹 애플리케이션 프로젝트를 빌드하고 패키지할 때 WPP는 .wpp.targets 파일을 자동으로 검색합니다. App_offline-template.htm 파일은 결과 웹 배포 패키지에 App_offline.htm포함됩니다.

참고

배포에 실패하면 App_offline.htm 파일이 그대로 유지되고 애플리케이션이 오프라인 상태로 유지됩니다. 일반적으로 바람직한 동작입니다. 애플리케이션을 다시 온라인 상태로 만들려면 웹 서버에서 App_offline.htm 파일을 삭제할 수 있습니다. 또는 오류를 수정하고 성공적인 배포를 실행하면 App_offline.htm 파일이 제거됩니다.

결론

이 항목에서는 배포 프로세스 시작 시 대상 서버에 App_offline.htm 파일을 게시하고 마지막에 제거하여 배포 기간 동안 웹 애플리케이션을 오프라인으로 만드는 방법을 설명했습니다. 또한 웹 배포 패키지에 App_offline.htm 파일을 포함하는 방법도 설명했습니다.

추가 정보

패키징 및 배포 프로세스에 대한 자세한 내용은 웹 애플리케이션 프로젝트 빌드 및 패키징, 웹 패키지 배포에 대한 매개 변수 구성웹 패키지 배포를 참조하세요.

이러한 자습서에 설명된 사용자 지정 MSBuild 프로젝트 파일 접근 방식을 사용하는 대신 Visual Studio에서 직접 웹 애플리케이션을 게시하는 경우 게시 프로세스 중에 애플리케이션을 오프라인으로 전환하려면 약간 다른 방법을 사용해야 합니다.