

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 自定义 ASP.NET Core Elastic Beanstalk 部署
<a name="deployment-beanstalk-custom-netcore"></a>

本主题介绍部署的工作原理，以及在利用 Elastic Beanstalk 和 Toolkit for Visual Studio 创建 ASP.NET Core 应用程序时如何自定义部署。

在 Toolkit for Visual Studio 中完成部署向导后，Toolkit 将对该应用程序打包并将其发送到 Elastic Beanstalk。创建应用程序包的第一步是借助新的 dotnet CLI 为应用程序做好使用 **publish** 命令进行发布的准备。框架和配置将从向导中的设置向下传递到 **publish** 命令。因此，如果您为 `configuration` 选择了**发布**，为 `framework` 选择了 **netcoreapp1.0**，则 Toolkit 将执行以下命令：

 `dotnet publish --configuration Release --framework netcoreapp1.0` 

当 **publish** 命令完成后，Toolkit 会将新的部署清单写入到发布文件夹。此部署清单是一个名为 **aws-windows-deployment-manifest.json** 的 JSON 文件，Elastic Beanstalk Windows 容器（版本 1.2 或更高版本）将读取该文件以确定如何部署应用程序。例如，对于要在 IIS 的根处部署的 ASP.NET 内核应用程序，Toolkit 将生成一个清单文件，如下所示：

```
{
  "manifestVersion": 1,
  "deployments": {

    "aspNetCoreWeb": [
      {
        "name": "app",
        "parameters": {
          "appBundle": ".",
          "iisPath": "/",
          "iisWebSite": "Default Web Site"
        }
      }
    ]
  }
}
```

`appBundle` 属性指示了应用程序位与清单文件相关的位置。此属性可指向目录或 ZIP 存档。`iisPath` 和 `iisWebSite` 属性指示了 IIS 中要托管应用程序的位置。

## 自定义清单
<a name="tkv-deploy-beanstalk-custom-netcore-manifest"></a>

如果某个清单文件在发布文件夹中尚不存在，则 Toolkit 仅写入该清单文件。如果该文件已存在，Toolkit 将更新该清单的 `appBundle` 部分下列出的第一个应用程序中的 `iisPath`、`iisWebSite` 和 `aspNetCoreWeb` 属性。这使您可以将 **aws-windows-deployment-manifest.json** 添加到您的项目并自定义该清单。要对 Visual Studio 中的 ASP.NET 内核 Web 应用程序执行此操作，请将新的 JSON 文件添加到项目的根并将其命名为 **aws-windows-deployment-manifest.json**。

该清单必须命名为 **aws-windows-deployment-manifest.json** 且必须位于项目的根处。Elastic Beanstalk 容器将在根中寻找该清单，如果找到，则会调用部署工具。如果该文件不存在，Elastic Beanstalk 容器将回退到较早的部署工具，该工具假定存档为 **msdeploy** 存档。

要确保 dotnet CLI `publish` 命令包含该清单，请更新 `project.json` 文件以将该清单文件包含在 `include` 中 `publishOptions` 下的 include 部分。

```
{
   "publishOptions": {
     "include": [
       "wwwroot",
       "Views",
       "Areas/**/Views",
       "appsettings.json",
       "web.config",
       "aws-windows-deployment-manifest.json"
     ]
   }
 }
```

既然您已声明该清单以便让它包含在应用程序包中，您可以进一步配置要部署应用程序的方式。除了部署向导所支持的部署之外，您还可以自定义部署。AWS 已为 **aws-windows-deployment-manifest.json 文件**定义了 JSON 架构，并且在您安装 Toolkit for Visual Studio 后，该安装程序为架构注册了 URL。

当您打开 `windows-deployment-manifest.json` 时，您将看到在“Schema (架构)”下拉框中选择的架构 URL。您可以导航到该 URL 以获取可在该清单中设置的内容的完整说明。在已选择该架构的情况下，Visual Studio 将在您编辑该清单时提供 IntelliSense。

您可以执行的一项自定义是配置应用程序将在其下运行的 IIS 应用程序池。以下示例显示了如何定义 IIS 应用程序池（“customPool”），该池每 60 分钟再循环一次流程，并使用 `"appPool": "customPool"` 将流程分配到应用程序。

```
{
  "manifestVersion": 1,
  "iisConfig": {
    "appPools": [
      {
        "name": "customPool",
        "recycling": {
          "regularTimeInterval": 60
        }
      }
    ]
  },
  "deployments": {
    "aspNetCoreWeb": [
      {
        "name": "app",
        "parameters": {
          "appPool": "customPool"
        }
      }
    ]
  }
}
```

此外，该清单还可以声明 Windows PowerShell 脚本在安装、重启和卸载操作之前和之后运行。例如，以下清单运行 Windows PowerShell 脚本 `PostInstallSetup.ps1` 以在 ASP.NET 内核应用程序部署到 IIS 之后完成进一步设置工作。在添加类似这样的脚本时，请确保将它们添加到 `project.json` 文件中的 publishOptions 下的 include 部分，正如对 `aws-windows-deployment-manifest.json` 文件的处理方式一样。如果没有这样做，这些脚本将不会作为 dotnet CLI **publish** 命令的一部分包含。

```
{
  "manifestVersion": 1,
  "deployments": {
    "aspNetCoreWeb": [
      {
        "name": "app",
        "scripts": {
          "postInstall": {
            "file": "SetupScripts/PostInstallSetup.ps1"
          }
        }
      }
    ]
  }
}
```

## ebextensions 怎么样？
<a name="tkv-deploy-beanstalk-custom-netcore-ebextensions"></a>

Elastic Beanstalk **.ebextensions** 配置文件像在所有其他 Elastic Beanstalk 容器中一样受支持。要在 ASP.NET 内核应用程序中包含 ebextensions，请将 `.ebextensions` 目录添加到 `include` 文件中的 `publishOptions` 下的 `project.json` 部分。有关 ebextensions 的更多信息，请查阅 [Elastic Beanstalk 开发人员指南](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/ebextensions.html)。