使用 Web Deploy 讓 Web 應用程式離線

作者 :Jason Lee

本主題描述如何使用 Internet Information Services (IIS) Web Deployment Tool (Web Deploy) ,讓 Web 應用程式離線進行自動化部署。 流覽至 Web 應用程式的使用者會重新導向至 App_offline.htm 檔案,直到部署完成為止。

本主題以名為 Fabrikam, Inc 的虛構公司企業部署需求為基礎,形成一系列教學課程的一部分。本教學課程系列使用範例解決方案連絡人 管理員解決方案來代表具有實際複雜程度的 Web 應用程式,包括 ASP.NET MVC 3 應用程式、Windows Communication Foundation (WCF) 服務和資料庫專案。

這些教學課程的核心部署方法是以 瞭解專案檔中所述的分割專案檔方法為基礎,其中建置程式是由兩個專案檔控制,一個包含適用于每個目的地環境的建置指示,另一個包含環境特定的組建和部署設定。 在建置階段,環境特定的專案檔會合並到與環境無關的專案檔中,以形成一組完整的建置指示。

工作概觀

在很多情況下,當您對資料庫或 Web 服務等相關元件進行變更時,您會想要讓 Web 應用程式離線。 一般而言,在 IIS 和 ASP.NET 中,您會將名為 App_offline.htm 的檔案放在 IIS 網站或 Web 應用程式的根資料夾中來完成此作業。 App_offline.htm檔案是標準的 HTML 檔案,通常會包含簡單的訊息,告知使用者網站因為維護而暫時無法使用。 雖然 App_offline.htm 檔案存在於網站的根資料夾中,但 IIS 會自動將任何要求重新導向至檔案。 完成更新後,您會移除 App_offline.htm 檔案,而網站會如往常繼續處理要求。

當您使用 Web Deploy 對目標環境執行自動化或單一步驟部署時,建議您將新增和移除 App_offline.htm 檔案併入您的部署程式中。 若要這樣做,您必須完成這些高階工作:

  • 在您用來控制部署程式的Microsoft Build Engine (MSBuild) 專案檔中,建立 MSBuild 目標,將App_offline.htm檔案複製到目的地伺服器,再開始任何部署工作。
  • 新增另一個 MSBuild 目標,以在所有部署工作完成時,從目的地伺服器移除 App_offline.htm 檔案。
  • 在 Web 應用程式專案中,建立 .wpp.targets 檔案,以確保叫用 Web 部署時 ,會將App_offline.htm 檔案新增至部署套件。

本主題將示範如何執行這些程式。 本主題中的工作和逐步解說假設您已經建立包含至少一個 Web 應用程式專案的解決方案,而且您使用自訂專案檔來控制部署程式,如 企業中的 Web 部署中所述。 或者,您也可以使用 連絡人管理員 範例解決方案來遵循主題中的範例。

將App_Offline檔案新增至 Web 應用程式專案

您需要完成的第一項工作是將 App_offline 檔案新增至 Web 應用程式專案:

  • 若要防止檔案干擾開發程式, (您不想讓應用程式永久離線) ,您應該將其稱為 App_offline.htm以外的專案。 例如,您可以將檔案 命名為App_offline-template.htm
  • 若要防止檔案依原樣部署,您應該將建置動作設定為 [無]。

將App_offline檔案新增至 Web 應用程式專案

  1. 在 Visual Studio 2010 中開啟您的方案。

  2. [方案總管] 視窗中,以滑鼠右鍵按一下 Web 應用程式專案,指向 [新增],然後按一下 [新增專案]。

  3. 在 [ 新增專案 ] 對話方塊中,選取 [HTML 頁面]。

  4. 在 [ 名稱] 方塊 ,輸入App_offline-template.htm,然後按一下 [ 新增]。

    在 [名稱] 方塊中,輸入 App_offline-template.htm,然後按一下 [新增]。

  5. 新增一些簡單的 HTML 以通知使用者應用程式無法使用,然後儲存檔案。 例如,請勿包含任何伺服器端標記 (,任何前面加上 「asp:」) 的標記。

    新增一些簡單的 H T M L,通知使用者應用程式無法使用,然後儲存檔案。

  6. [方案總管] 視窗中,以滑鼠右鍵按一下新檔案,然後按一下 [屬性]。

  7. 在 [ 屬性] 視窗的 [ 建置動作 ] 資料列中,選取 [無]。

    在屬性視窗的 [建置動作] 資料列中,選取 [無]。

部署和刪除App_Offline檔案

下一個步驟是修改部署邏輯,以在部署程式開始時將檔案複製到目的地伺服器,並在結尾移除它。

注意

下一個程式假設您使用自訂 MSBuild 專案檔來控制部署程式,如 瞭解專案檔中所述。 如果您要直接從 Visual Studio 部署,則必須使用不同的方法。 Sayed Ibflineim Hashimi 描述 如何在發佈期間讓 Web 應用程式離線的其中一種方法。

若要將 App_offline 檔案部署至目的地 IIS 網站,您必須使用 Web Deploy contentPath 提供者叫用MSDeploy.exe。 contentPath提供者同時支援實體目錄路徑和 IIS 網站或應用程式路徑,使其成為在 Visual Studio 專案資料夾與 IIS Web 應用程式之間同步處理檔案的理想選擇。 若要部署檔案,您的 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 專案檔。 在 連絡人管理員 範例解決方案中,這是 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 檔案部署至目的地 Web 服務器的 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的新目標。 在此目標內,叫用 MSDeploy.exe 命令,以從目的地 Web 服務器移除 您的App_offline 檔案。

    <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檔案新增至部署套件

視您設定部署的方式而定,當您將 Web 套件部署至目的地時,目的地 IIS Web 應用程式的任何現有內容,例如 App_offline.htm 檔案,可能會自動刪除。 若要確保部署期間仍保留 App_offline.htm 檔案,除了直接在部署程式開始時部署檔案之外,還需要在 Web 部署套件本身中包含檔案。

  • 如果您已遵循本主題中的先前工作,您會在不同的檔案名下將 App_offline.htm 檔案新增至 Web 應用程式專案, (我們使用 App_offline-template.htm) ,而且您已將建置動作設定為 [無]。 這些變更是必要的,以防止檔案干擾開發和偵錯。 因此,您必須自訂封裝程式,以確保 web 部署套件中包含 App_offline.htm 檔案。

Web 發佈管線 (WPP) 使用名為 FilesForPackagingFromProject 的專案清單來建置應該包含在 Web 部署套件中的檔案清單。 您可以將您自己的專案新增至此清單,以自訂 Web 套件的內容。 若要這樣做,您需要完成下列高階步驟:

  1. 在與專案檔相同的資料夾中,建立名為 [專案名稱].wpp.targets 的自訂專案檔。

    注意

    .wpp.targets檔案必須與 Web 應用程式專案檔位於相同的資料夾中,例如ContactManager.Mvc.csproj,而不是與您用來控制建置和部署程式的任何自訂專案檔位於相同的資料夾中。

  2. .wpp.targets檔案中,建立新的 MSBuild 目標,在CopyAllFilesToSingleFolderForPackage目標之前執行。 這是 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.htm重新命名為App_offline.htm,因為它已新增至清單。

下一個程式會示範如何將這個 .wpp.targets 檔案新增至 Web 應用程式專案。

將 .wpp.targets 檔案新增至 Web 部署套件

  1. 在 Visual Studio 2010 中開啟您的解決方案。

  2. [方案總管]視窗中,以滑鼠右鍵按一下 Web 應用程式專案節點 (,例如ContactManager.Mvc) ,指向 [新增],然後按一下 [新增專案]。

  3. 在 [ 新增專案 ] 對話方塊中,選取 [XML 檔案] 範本。

  4. 在 [ 名稱] 方塊中,輸入 [專案名稱].wpp.targets (例如 ContactManager.Mvc.wpp.targets) ,然後按一下 [ 新增]。

    在 [名稱] 方塊中,輸入專案名稱 .wpp.targets,然後按一下 [新增]。

    注意

    如果您將新專案新增至專案的根節點,檔案會建立在與專案檔相同的資料夾中。 您可以在 Windows 檔案總管中開啟資料夾來確認這一點。

  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 檔案。

下次建置和封裝 Web 應用程式專案時,WPP 會自動偵測 .wpp.targets 檔案。 App_offline-template.htm檔案將會包含在產生的 Web 部署套件中,作為App_offline.htm

注意

如果您的部署失敗, App_offline.htm 檔案會保持原位,且您的應用程式會保持離線狀態。 這通常是所需的行為。 若要讓應用程式重新上線,您可以從網頁伺服器刪除 App_offline.htm 檔案。 或者,如果您更正任何錯誤並執行成功的部署,將會移除 App_offline.htm 檔案。

結論

本主題描述如何在部署期間讓 Web 應用程式離線,方法是在部署程式開始時將 App_offline.htm 檔案發佈至目的地伺服器,並在結尾移除它。 它也涵蓋如何在 Web 部署套件中包含 App_offline.htm 檔案。

深入閱讀

如需封裝和部署程式的詳細資訊,請參閱 建置和封裝 Web 應用程式專案設定 Web 套件部署的參數,以及 部署 Web 套件

如果您直接從 Visual Studio 發佈 Web 應用程式,而不是使用這些教學課程中所述的自訂 MSBuild 專案檔方法,您必須使用稍微不同的方法來讓應用程式在發佈程式期間離線。