設定 Web 套件部署的參數

作者 :Jason Lee

本主題描述如何在您將 Web 套件部署至遠端 IIS Web 服務器時,設定參數值,例如 Internet Information Services (IIS) Web 應用程式名稱、連接字串和服務端點。

當您建置 Web 應用程式專案時,建置和封裝程式會產生三個主要檔案:

  • [專案名稱].zip檔案。 這是 Web 應用程式專案的 Web 部署套件。 此套件包含在遠端 IIS Web 服務器上重新建立 Web 應用程式所需的所有元件、檔案、資料庫腳本和資源。
  • [專案名稱].deploy.cmd檔案。 這包含一組參數化的 Web Deploy (MSDeploy.exe) 命令,這些命令會將 Web 部署套件發佈至遠端 IIS Web 服務器。
  • [專案名稱].SetParameters.xml檔案。 這會提供一組參數值給 MSDeploy.exe 命令。 您可以在部署 Web 套件時,更新此檔案中的值,並將其傳遞至 Web Deploy 作為命令列參數。

注意

如需建置和封裝程式的詳細資訊,請參閱建置 和封裝 Web 應用程式專案

SetParameters.xml檔案會從 Web 應用程式專案檔和專案內的任何組態檔動態產生。 當您建置和封裝專案時,Web 發佈管線 (WPP) 會自動偵測許多可能變更部署環境之間的變數,例如目的地 IIS Web 應用程式和任何資料庫連接字串。 這些值會在 Web 部署套件中自動參數化,並新增至 SetParameters.xml 檔案。 例如,如果您將連接字串新增至 Web 應用程式專案中 的web.config 檔案,建置程式會偵測這項變更,並據此將專案新增至 SetParameters.xml 檔案。

在許多情況下,這個自動參數化就已足夠。 不過,如果您的使用者需要在部署環境之間變更其他設定,例如應用程式設定或服務端點 URL,您必須告訴 WPP 在部署套件中參數化這些值,並將對應的專案新增至 SetParameters.xml 檔案。 後續各節說明如何執行這項操作。

自動參數化

當您建置和封裝 Web 應用程式時,WPP 會自動參數化下列專案:

  • 目的地 IIS Web 應用程式路徑和名稱。
  • web.config檔案中的任何連接字串。
  • 您在專案屬性頁中新增至 [封裝/發佈 SQL ] 索引標籤之任何資料庫的連接字串。

例如,如果您要建置並封裝 Contact Manager 範例解決方案,而不需要以任何方式觸碰參數化程式,WPP 就會產生此 ContactManager.Mvc.SetParameters.xml 檔案:

<parameters>
  <setParameter 
    name="IIS Web Application Name" 
    value="Default Web Site/ContactManager.Mvc_deploy" />  
  <setParameter 
    name="ApplicationServices-Web.config Connection String" 
    value="Data Source=DEVWORKSTATION\SQLEXPRESS;Initial Catalog=CMAppServices;
           Integrated Security=true;" />
</parameters>

在此案例中:

  • IIS Web 應用程式名稱參數是您要部署 Web 應用程式的 IIS 路徑。 預設值取自專案屬性頁中的 Package/Publish 網頁
  • ApplicationServices-Web.config連接字串參數是從web.config檔案中的connectionStrings/add元素產生。 它代表應用程式應該用來連絡成員資格資料庫的連接字串。 您在這裡提供的值會取代為已部署 的web.config 檔案。 預設值取自部署前 web.config 檔案。

WPP 也會在產生的部署套件中參數化這些屬性。 您可以在安裝部署套件時提供這些屬性的值。 如果您透過 IIS 管理員手動安裝套件,如 手動安裝 Web 套件中所述,安裝精靈會提示您提供任何參數的值。 如果您使用 .deploy.cmd 檔案從遠端安裝套件,如 部署 Web 套件中所述,Web Deploy 會查看此 SetParameters.xml 檔案以提供參數值。 您可以手動編輯 SetParameters.xml 檔案中的值,也可以自訂檔案做為自動化建置和部署程式的一部分。 本主題稍後會更詳細地說明此程式。

自訂參數化

在更複雜的部署案例中,您通常會想要在部署專案之前參數化其他屬性。 一般而言,您應該將目的地環境之間差異的任何屬性和設定參數化。 這些進入點包括:

  • web.config檔案中的服務端點。
  • web.config檔案中的應用程式設定。
  • 您想要提示使用者指定的任何其他宣告式屬性。

參數化這些屬性最簡單的方式是將 parameters.xml 檔案新增至 Web 應用程式專案的根資料夾。 例如,在連絡人管理員解決方案中,ContactManager.Mvc 專案會在根資料夾中包含 parameters.xml 檔案。

在連絡人管理員解決方案中,ContactManager.Mvc 專案會在根資料夾中包含parameters.xml檔案。

如果您開啟此檔案,您會看到它包含單一 參數 專案。 專案會使用 XML 路徑語言 (XPath) 查詢,在 web.config 檔案中尋找並參數化 ContactService Windows Communication Foundation (WCF) 服務的端點 URL。

<parameters>
  <parameter name="ContactService Service Endpoint Address"
             description="Specify the endpoint URL for the ContactService WCF 
                          service in the destination environment"
             defaultValue="http://localhost/ContactManagerService">
    <parameterEntry kind="XmlFile" scope="Web.config"
                    match="/configuration/system.serviceModel/client
                           /endpoint[@name='BasicHttpBinding_IContactService']
                           /@address" />
  </parameter>
</parameters>

除了參數化部署套件中的端點 URL 之外,WPP 也會將對應的專案新增至與部署套件一起產生的 SetParameters.xml 檔案。

<parameters>
  ...  
  <setParameter 
    name="ContactService Service Endpoint Address" 
    value="http://localhost/ContactManagerService" />
  ...
</parameters>

如果您手動安裝部署套件,IIS 管理員會提示您輸入服務端點位址,以及參數化自動的屬性。 如果您藉由執行 .deploy.cmd 檔案來安裝部署套件,您可以編輯 SetParameters.xml 檔案,以提供服務端點位址的值,以及參數化屬性的值。

如需如何建立 parameters.xml 檔案的完整詳細資料,請參閱 如何:在安裝套件時使用參數來設定部署設定。 名為 To use deployment parameters for Web.config file settings 的程式提供逐步指示。

修改SetParameters.xml檔案

如果您打算透過執行 .deploy.cmd 檔案或從命令列執行MSDeploy.exe來手動部署 Web 應用程式套件,則不會阻止您在部署之前手動編輯 SetParameters.xml 檔案。 不過,如果您正在處理企業級解決方案,您可能需要將 Web 應用程式套件部署為較大、自動化建置和部署程式的一部分。 在此案例中,您需要Microsoft Build Engine (MSBuild) 來為您修改SetParameters.xml檔案。 您可以使用 MSBuild XmlPoke 工作來執行此動作。

連絡人管理員範例解決方案說明此程式。 下列程式碼範例已經過編輯,只顯示與這個範例相關的詳細資料。

注意

如需範例方案中專案檔模型的廣泛概觀,以及一般自訂專案檔的簡介,請參閱 瞭解專案檔瞭解建置程式

首先,感興趣的參數值會定義為環境特定專案檔中的屬性 (,例如 Env-Dev.proj) 。

<PropertyGroup> 
  <ContactManagerIisPath Condition=" '$(ContactManagerIisPath)'=='' ">
    DemoSite/ContactManager
  </ContactManagerIisPath>
  <ContactManagerTargetUrl Condition =" '$(ContactManagerTargetUrl)'=='' ">
    http://localhost:85/ContactManagerService/ContactService.svc
  </ContactManagerTargetUrl>
  <MembershipConnectionString Condition=" '$(MembershipConnectionString)'=='' ">
    Data Source=TESTDB1;Integrated Security=true;Initial Catalog=CMAppServices
  </MembershipConnectionString>  
</PropertyGroup>

注意

如需如何為您自己的伺服器環境自訂環境特定專案檔的指引,請參閱 設定目標環境的部署屬性

接下來, Publish.proj 檔案會匯入這些屬性。 由於每個SetParameters.xml檔案都與.deploy.cmd檔案相關聯,因此我們最終希望專案檔叫用每個.deploy.cmd檔案,因此專案檔會為每個.deploy.cmd檔案建立 MSBuild專案,並將感興趣的屬性定義為專案中繼資料

<ItemGroup>
  <PublishPackages Include="$(_ContactManagerDest)ContactManager.Mvc.deploy.cmd"> 
    <ParametersXml>
      $(_ContactManagerDest)ContactManager.Mvc.SetParameters.xml
    </ParametersXml>
    <IisWebAppName>
      $(ContactManagerIisPath)
    </IisWebAppName> 
    <MembershipDBConnectionName>
      ApplicationServices-Web.config Connection String
    </MembershipDBConnectionName>
    <MembershipDBConnectionString>
      $(MembershipConnectionString.Replace(";","%3b"))
    </MembershipDBConnectionString>
    <ServiceEndpointParamName>
      ContactService Service Endpoint Address
    </ServiceEndpointParamName>
    <ServiceEndpointValue>
      $(ContactManagerTargetUrl)
    </ServiceEndpointValue>
  </PublishPackages>
  ...
</ItemGroup>

在此案例中:

  • ParametersXml中繼資料值表示SetParameters.xml檔案的位置。
  • IisWebAppName值是您要部署 Web 應用程式的 IIS 路徑。
  • MembershipDBConnectionString值是成員資格資料庫的連接字串,而MembershipDBConnectionName值是SetParameters.xml檔案中對應參數的名稱屬性。
  • ServiceEndpointValue值是目的地伺服器上的 WCF 服務的端點位址,而 ServiceEndpointParamName值是SetParameters.xml檔案中對應參數的名稱屬性。

最後,在 Publish.proj 檔案中, PublishWebPackages 目標會使用 XmlPoke 工作修改 SetParameters.xml 檔案中的這些值。

<Target Name="PublishWebPackages" Outputs="%(PublishPackages.Identity)">
  <XmlPoke 
    XmlInputPath="%(PublishPackages.ParametersXml)"
    Query="//parameters/setParameter[@name='%(PublishPackages.ConnectionName)']
           /@value"
    Value="%(PublishPackages.ConnectionString)"
    Condition =" '%(PublishPackages.ConnectionName)'!=''" 
  />
  <XmlPoke 
    XmlInputPath="%(PublishPackages.ParametersXml)"
    Query="//parameters/setParameter
           [@name='%(PublishPackages.MembershipDBConnectionName)']/@value"
    Value='%(PublishPackages.MembershipDBConnectionString)'
    Condition =" '%(PublishPackages.MembershipDBConnectionName)'!=''" 
  />
  <XmlPoke 
    XmlInputPath="%(PublishPackages.ParametersXml)"
    Query="//parameters/setParameter[@name='IIS Web Application Name']/@value"
    Value="%(PublishPackages.IisWebAppName)"
    Condition =" '%(PublishPackages.IisWebAppName)'!=''" 
  />
  <XmlPoke 
    XmlInputPath="%(PublishPackages.ParametersXml)"
    Query="//parameters/setParameter
           [@name='%(PublishPackages.ServiceEndpointParamName)']/@value"
    Value="%(PublishPackages.ServiceEndpointValue)"
    Condition =" '%(PublishPackages.ServiceEndpointParamName)'!=''" 
  /> 
  <!--Execute the .deploy.cmd file--> 
  ...
</Target>

您會發現每個 XmlPoke 工作都會指定四個屬性值:

  • XmlInputPath屬性會告訴工作在何處尋找您想要修改的檔案。
  • Query屬性是一個 XPath 查詢,可識別您想要變更的 XML 節點。
  • Value屬性是您要插入所選 XML 節點的新值。
  • Condition屬性是工作應該執行或未執行的準則。 在這些情況下,條件可確保您不會嘗試將 null 或空白值插入 SetParameters.xml 檔案中。

結論

本主題描述 SetParameters.xml 檔案的角色,並說明當您建置 Web 應用程式專案時如何產生檔案。 其中說明如何將 parameters.xml 檔案新增至專案,以參數化其他設定。 它也描述如何使用專案檔中的XmlPoke工作,將SetParameters.xml檔案修改為較大、自動化建置程式的一部分。

下一個主題 部署 Web 套件說明如何執行 .deploy.cmd 檔案或使用MSDeploy.exe命令來部署 Web 套件。 在這兩種情況下,您可以將 SetParameters.xml 檔案指定為部署參數。

深入閱讀

如需如何建立 Web 套件的資訊,請參閱 建置和封裝 Web 應用程式專案。 如需如何實際部署 Web 套件的指引,請參閱 部署 Web 套件。 如需如何建立 parameters.xml 檔案的逐步解說,請參閱 如何:在安裝套件時使用參數來設定部署設定

如需 Web Deploy 中參數化的詳細資訊,請參閱 Web Deploy 參數化 (部落格文章) 。