部署 Web 程序包

作者: Jason Lee

本主题介绍如何使用 Internet 信息服务(IIS)Web 部署工具(Web 部署)2.0 将 Web 部署包发布到远程服务器。

可通过两种主要方式将 Web 包部署到远程服务器:

  • 可以直接使用MSDeploy.exe命令行实用工具。
  • 可以运行 生成进程生成的 [项目名称].deploy.cmd 文件。

无论使用哪种方法,最终结果都是相同的。 实质上, 所有.deploy.cmd 文件都是使用一些预先确定的值运行MSDeploy.exe,因此无需提供尽可能多的信息即可部署包。 这简化了部署过程。 另一方面,直接使用 MSDeploy.exe可让你更灵活地确切地部署包。

使用哪种方法取决于各种因素,包括对部署过程所需的控制程度,以及是面向 Web 部署远程代理服务还是 Web 部署处理程序。 本主题介绍如何使用每个方法并标识每个方法是否合适。

本主题中的任务和演练假定:

  • 已生成和打包 Web 应用程序,如生成和打包 Web 应用程序项目中所述
  • 已修改SetParameters.xml文件,为目标环境提供正确的参数值,如“为 Web 包部署配置参数”中所述

运行 [项目名称].deploy.cmd 文件是部署 Web 包的最简单方法。 具体而言,使用 .deploy.cmd 文件可提供以下优势,而直接使用MSDeploy.exe:

  • 无需指定 Web 部署包的位置 -- .deploy.cmd 文件已知道它的位置。
  • 无需指定SetParameters.xml文件的位置- .deploy.cmd文件已知道文件的位置。
  • 无需指定源和目标 MSDeploy 提供程序 - .deploy.cmd 文件已知道要使用的值。
  • 无需指定 MSDeploy 操作设置 - .deploy.cmd 文件会自动将常用值添加到 MSDeploy.exe 命令。

在使用 .deploy.cmd 文件部署 Web 包之前,应确保:

  • .deploy.cmd文件([项目名称]。 SetParameters.xml文件和 Web 包([项目名称]。zip) 位于同一文件夹中。
  • Web 部署(MSDeploy.exe)安装在运行 .deploy.cmd 文件的计算机上。

.deploy.cmd文件支持各种命令行选项。 从命令提示符运行该文件时,这是基本语法:

[project name].deploy.cmd [/T | /Y]
                          [/M:<computer name>]
                          [/A:<Basic | NTLM>]
                          [/U:<user name>]
                          [/P:<password>]
                          [/L]
                          [/G:<true | false>]
                          [Additional MSDeploy.exe flags]

必须指定 /T 标志或 /Y 标志,以指示是要分别执行试用版运行还是实时部署(不要在同一命令中使用这两个标志)。 下表说明了每个标志的用途。

标记 说明
/T 使用 –whatif 标志(指示试用运行)调用MSDeploy.exe。 它不部署包,而是创建一个报告,说明部署包时会发生什么情况。
/Y 在没有 –whatif 标志的情况下调用MSDeploy.exe。 这会将包部署到本地计算机或指定的目标服务器。
/M 指定目标服务器名称或服务 URL。 有关此处提供的值的详细信息,请参阅 本主题中的“终结点注意事项 ”部分。 如果省略 /M 标志,包将部署到本地计算机。
/一个 指定MSDeploy.exe用于执行部署的身份验证类型。 可能的值为 BearerNTLMBasic 如果省略 /A 标志,身份验证类型默认为 NTLM,以便部署到 Web 部署远程代理服务和基本部署以部署到 Web 部署处理程序。
/U 指定用户名。 仅当使用基本身份验证时,这才适用。
/P 指定密码。 仅当使用基本身份验证时,这才适用。
/L 指示包应部署到本地 IIS Express 实例。
/G 指定使用 tempAgent 提供程序设置部署包。 如果省略 /G 标志,则值默认值为 false

注意

每次生成过程创建 Web 包时,它还会创建一个名为 [项目名称]的文件,.deploy-readme.txt 来解释这些部署选项。

除了这些标志,还可以将 Web 部署操作设置指定为其他 .deploy.cmd 参数。 你指定的任何其他设置都直接传递到基础MSDeploy.exe命令。 有关这些设置的详细信息,请参阅 Web 部署操作设置

假设你想要通过运行 .deploy.cmd 文件将 ContactManager.Mvc Web 应用程序项目部署到测试环境。 测试环境配置为使用 Web 部署远程代理服务,如配置 Web 服务器进行 Web 部署发布(远程代理)中所述。 若要部署 Web 应用程序,需要完成后续步骤。

使用 .deploy.cmd 文件部署 Web 应用程序

  1. 生成和打包 Web 应用程序项目,如生成和打包 Web 应用程序项目中所述

  2. 修改ContactManager.Mvc.SetParameters.xml文件以包含测试环境的正确参数值,如“为 Web 包部署配置参数”中所述

  3. 打开命令提示符窗口并导航到ContactManager.Mvc.deploy.cmd文件的位置

  4. 键入此命令,然后按 Enter:

    ContactManager.Mvc.deploy.cmd /Y /M:TESTWEB1 /A:NTLM
    

在此示例中:

  • /Y 标志指示你想要实际部署包,而不是执行试用版运行。
  • /M 标志指示要将包部署到名为 TESTWEB1 的服务器。 从此值中,MSDeploy.exe将尝试将包部署到 Web 部署远程代理服务 http://TESTWEB1/MSDeployAgentService.
  • /A 标志指示要使用 NTLM 身份验证。 因此,无需指定用户名和密码。

若要说明如何使用 .deploy.cmd 文件简化部署过程,请查看使用上面所示的选项运行 ContactManager.Mvc.deploy.cmd 时生成的MSDeploy.exe命令。

msdeploy.exe 
-source:package='C:\Users\matt.FABRIKAM\Desktop\ContactManager-03\ContactManager\
 Publish\Out\_PublishedWebsites\ContactManager.Mvc_Package\ContactManager.Mvc.zip' -dest:auto,computerName='TESTWEB1.fabrikam.net', authtype='NTLM',
 includeAcls='False' 
-verb:sync 
-disableLink:AppPoolExtension 
-disableLink:ContentExtension 
-disableLink:CertificateExtension 
-setParamFile:"C:\Users\matt.FABRIKAM\Desktop\ContactManager-03\ContactManager\
 Publish\Out\_PublishedWebsites\ContactManager.Mvc_Package\
 ContactManager.Mvc.SetParameters.xml"

有关使用 .deploy.cmd 文件部署 Web 包的详细信息,请参阅 如何:使用 deploy.cmd 文件安装部署包。

使用 MSDeploy.exe

尽管使用 .deploy.cmd 文件通常简化了部署过程,但在某些情况下,最好直接使用MSDeploy.exe。 例如:

  • 如果要以非管理员用户身份部署到 Web 部署处理程序,则无法使用 .deploy.cmd 文件。 这是由于 Web 部署 2.0 中的 bug,如终结点注意事项中所述
  • 如果要在不同位置的不同 SetParameters.xml 文件之间手动切换,建议直接使用MSDeploy.exe。
  • 如果要替代多个MSDeploy.exe命令行参数,建议直接使用MSDeploy.exe。

使用MSDeploy.exe时,需要提供三个关键信息:

  • 一个 –source 参数,指示数据的来源。
  • 一个 –dest 参数,指示数据要到何处。
  • 指示要执行的操作的 –verb 参数。

MSDeploy.exe依赖于 Web 部署提供程序 来处理源数据和目标数据。 Web 部署包括许多提供程序,这些提供程序表示它可以使用的应用程序和数据源范围,例如,SQL Server 数据库、IIS Web 服务器、证书、全局程序集缓存 (GAC) 程序集、各种不同的配置文件和大量其他类型的数据类型的提供程序。 –source 参数和 –dest 参数都必须以 –source:[providerName]=[location] 格式指定提供程序。 将 Web 包部署到 IIS 网站时,应使用以下值:

  • 提供程序始终是包。 例如:

    -source:package='[path to web package]'
    
  • –dest 提供程序始终是自动的。例如:

    -dest:auto='[server name or service URL]'
    
  • -verb 始终同步

    -verb:sync
    

此外,还需要指定各种其他 特定于提供程序的设置 和常规 操作设置。 例如,假设你想要将 ContactManager.Mvc Web 应用程序部署到过渡环境。 部署将面向 Web 部署处理程序,必须使用基本身份验证。 若要部署 Web 应用程序,需要完成后续步骤。

使用访问令牌通过MSDeploy.exe部署 Web 应用程序

MSDeploy V3 支持使用访问令牌(也称为持有者令牌)进行身份验证。 建议使用访问令牌,因为它们是最安全的。

  1. 生成和打包 Web 应用程序项目,如生成和打包 Web 应用程序项目中所述

  2. 修改ContactManager.Mvc.SetParameters.xml文件以包含过渡环境的正确参数值,如“为 Web 包部署配置参数”中所述

  3. 打开命令提示符窗口并浏览到MSDeploy.exe的位置。 这通常位于 %PROGRAMFILES%\IIS\Microsoft Web Deploy {version}\msdeploy.exe.

  4. 如果没有访问令牌,请使用以下命令创建一个:

    az account get-access-token --query accessToken

  5. 键入此命令,然后按 Enter(忽略换行符):

    MSDeploy.exe
      -source:package="[path]\ContactManager.Mvc.zip"
      -dest:auto,
            computerName="https://stageweb1:8172/MSDeploy.axd?site=DemoSite",
            username="FABRIKAM\stagingdeployer",
            $CREDENTIAL_PLACEHOLDER$,
            authtype="Bearer",
            includeAcls="False",
            Password="{token}"
      -verb:sync
      -disableLink:AppPoolExtension
      -disableLink:ContentExtension
      -disableLink:CertificateExtension
      -setParamFile:"[path]\ContactManager.Mvc.SetParameters.xml"
      -allowUntrusted
    

在此示例中:

  • –source 参数指定提供程序,并指示 Web 包的位置。
  • –dest 参数指定自动提供程序。 computerName 设置在目标服务器上提供 Web 部署处理程序的服务 URL。 身份验证类型设置Bearer指示要使用访问令牌进行身份验证,因此需要提供令牌值作为密码includeAcls=“False”设置指示你不想将源 Web 应用程序中文件的访问控制列表(ACL)复制到目标服务器。
  • –verb:sync 参数指示你想要在目标服务器上复制源内容。
  • –disableLink 参数指示你不想在目标服务器上复制应用程序池、虚拟目录配置或安全套接字层 (SSL) 证书。 有关详细信息,请参阅 Web 部署链接扩展
  • –setParamFile 参数提供SetParameters.xml文件的位置
  • –allowUntrusted 开关指示 Web 部署应接受未由受信任的证书颁发机构颁发的 SSL 证书。 如果要部署到 Web 部署处理程序,并且已使用自签名证书来保护服务 URL,则需要包含此开关。

使用 MSDeploy.exe 和基本身份验证部署 Web 应用程序

警告

如果提供了更安全的方法(持有者令牌),则不建议使用基本身份验证。

  1. 生成和打包 Web 应用程序项目,如生成和打包 Web 应用程序项目中所述

  2. 修改ContactManager.Mvc.SetParameters.xml文件以包含过渡环境的正确参数值,如“为 Web 包部署配置参数”中所述

  3. 打开命令提示符窗口并浏览到MSDeploy.exe的位置。 这通常位于 %PROGRAMFILES%\IIS\Microsoft Web Deploy {version}\msdeploy.exe.

  4. 键入此命令,然后按 Enter(忽略换行符):

    MSDeploy.exe
      -source:package="[path]\ContactManager.Mvc.zip"
      -dest:auto,
            computerName="https://stageweb1:8172/MSDeploy.axd?site=DemoSite",
            username="FABRIKAM\stagingdeployer",
            $CREDENTIAL_PLACEHOLDER$,
            authtype="Basic",
            includeAcls="False"
      -verb:sync
      -disableLink:AppPoolExtension
      -disableLink:ContentExtension
      -disableLink:CertificateExtension
      -setParamFile:"[path]\ContactManager.Mvc.SetParameters.xml"
      -allowUntrusted
    

在此示例中:

  • –source 参数指定提供程序,并指示 Web 包的位置。
  • –dest 参数指定自动提供程序。 computerName 设置在目标服务器上提供 Web 部署处理程序的服务 URL。 身份验证类型设置指示要使用基本身份验证,因此需要提供用户名和密码。 最后, includeAcls=“False” 设置指示你不想将源 Web 应用程序中文件的访问控制列表(ACL)复制到目标服务器。
  • –verb:sync 参数指示你想要在目标服务器上复制源内容。
  • –disableLink 参数指示你不想在目标服务器上复制应用程序池、虚拟目录配置或安全套接字层 (SSL) 证书。 有关详细信息,请参阅 Web 部署链接扩展
  • –setParamFile 参数提供SetParameters.xml文件的位置
  • –allowUntrusted 开关指示 Web 部署应接受未由受信任的证书颁发机构颁发的 SSL 证书。 如果要部署到 Web 部署处理程序,并且已使用自签名证书来保护服务 URL,则需要包含此开关。

自动执行 Web 包部署

在很多企业方案中,需要将 Web 包部署为更大的单步部署或自动化部署的一部分。 无论选择通过运行 .deploy.cmd 文件还是直接使用 MSDeploy.exe 来部署 Web 包,都可以参数化命令并从Microsoft 生成引擎 (MSBuild) 项目文件中的目标调用它们。

在 Contact Manager 示例解决方案中,查看 Publish.proj 文件中的 PublishWebPackages 目标。 此目标针对由名为 PublishPackages 的项列表标识的每个.deploy.cmd文件运行一次。 目标使用属性和项元数据为每个 .deploy.cmd 文件生成一组完整的参数值,然后使用 Exec 任务来运行命令。

<Target Name="PublishWebPackages" Outputs="%(PublishPackages.Identity)">
  ...
  <PropertyGroup>
    <_WhatIfSwitch>/Y</_WhatIfSwitch>
    <_WhatIfSwitch Condition=" '$(_WhatIf)'=='true' ">/T</_WhatIfSwitch>
    <_Cmd>
      %(PublishPackages.FullPath) $(_WhatifSwitch) /M:$(MSDeployComputerName) 
      /U:$(MSDeployUsername) /P:$(Password) /A:$(MSDeployAuth) 
      %(PublishPackages.AdditionalMSDeployParameters)
    </_Cmd>
  </PropertyGroup>
  <Exec Command="$(_Cmd)"/>
</Target>

注意

有关示例解决方案中项目文件模型的更广泛概述,以及一般自定义项目文件的简介,请参阅 了解项目文件了解生成过程

终结点注意事项

无论是运行 .deploy.cmd 文件还是直接使用 MSDeploy.exe 部署 Web 包,都需要为部署指定计算机名或服务终结点。

如果将目标 Web 服务器配置为使用 Web 部署远程代理服务进行部署,请将目标服务 URL 指定为目标。

http://[server name]/MSDeployAgentService

或者,可以将服务器名称单独指定为目标,Web 部署将推断远程代理服务 URL。

[server name]

如果将目标 Web 服务器配置为使用 Web 部署处理程序进行部署,则需要将 IIS Web 管理服务(WMSvc) 的终结点地址指定为目标。 默认情况下,这会采用以下格式:

https://[server name]:8172/MSDeploy.axd

可以使用.deploy.cmd文件或直接MSDeploy.exe以这些终结点中的任何一个为目标。 但是,如果要以非管理员用户身份部署到 Web 部署处理程序,如配置 Web Server for Web Deploy Publishing (Web 部署处理程序)中所述,需要向服务终结点地址添加查询字符串。

https://[server name]:8172/MSDeploy.axd?site=[IIS website name]

这是因为非管理员用户没有对 IIS 的服务器级访问权限;他或她只能访问特定的 IIS 网站。 在编写时,由于 Web 发布管道(WPP)中的 bug,无法使用包含查询字符串的终结点地址运行 .deploy.cmd 文件。 在此方案中,需要直接使用 MSDeploy.exe部署 Web 包。

注意

有关 Web 部署远程代理服务和 Web 部署处理程序的详细信息,请参阅 选择正确的 Web 部署方法。 有关如何配置特定于环境的项目文件以部署到这些终结点的指导,请参阅 配置目标环境的部署属性。

身份验证注意事项

无论是通过运行 .deploy.cmd 文件还是直接使用 MSDeploy.exe 部署 Web 包,都需要指定身份验证类型。 Web 部署接受可能的值:BearerNTLMBasic 如果指定 Bearer,则需要提供令牌作为密码和用户名的任何值。 如果指定基本身份验证,则还需要提供用户名和密码。 选择身份验证类型时,需要注意多种因素:

  • 如果要部署到 Web 部署远程代理服务,则必须使用 NTLM 身份验证。 远程代理服务不接受基本身份验证凭据。
  • 如果要部署到 Web 部署处理程序,可以使用访问令牌(持有者令牌)、NTLM 或基本身份验证。 默认设置是基本身份验证。 基本身份验证依赖于以纯文本形式传输的用户名和密码,因为 Web 部署处理程序始终使用 SSL 加密来保护凭据。 最安全的方法是使用访问令牌,避免发送实际密码。
  • 如果 Web 包包含数据库,并且 Web 服务器和数据库服务器是单独的计算机,则由于 NTLM“双跃点”限制,无法使用 NTLM 身份验证部署数据库。 需要在部署中使用 SQL Server 凭据连接字符串或向 Web 部署提供基本身份验证凭据。 在将成员身份数据库部署到企业环境更详细地介绍了此问题。

结束语

本主题介绍了如何通过运行 .deploy.cmd 文件或直接使用 MSDeploy.exe 来部署 Web 包。 其中介绍了每个方法何时可能合适,并介绍了如何在更大的单步或自动化生成过程中参数化和运行部署命令。

深入阅读

有关如何创建和参数化 Web 部署包的指导,请参阅 生成和打包 Web 应用程序项目 以及 配置 Web 包部署的参数。 有关如何从 Team Foundation Server (TFS) 实例生成和部署 Web 包的指导,请参阅 为 Team Foundation Server 配置自动化 Web 部署。 有关如何自定义和排查部署过程问题的信息,请参阅 “从部署中排除文件和文件夹”。