

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

# 使用部署清单运行多个应用程序和 ASP.NET 内核应用程序。
<a name="dotnet-manifest"></a>

您可以使用部署清单告知 Elastic Beanstalk 如何部署您的应用程序。通过使用此方法，您无需使用 `MSDeploy` 为在网站根路径上运行的单个 ASP.NET 应用程序生成源包。相反，您可以使用清单文件在不同路径上运行多个应用程序。或者，您也可以告诉 Elastic Beanstalk 使用 ASP.NET Core 部署和运行应用程序。您也可以使用部署清单配置一个应用程序池，在其中运行您的应用程序。

部署清单向 Elastic Beanstalk 添加了对 [.NET Core 应用程序](#dotnet-manifest-dotnetcore)的支持。您可以在不使用部署清单的情况下部署 .NET Framework 应用程序。但是，.NET Core 应用程序需要在 Elastic Beanstalk 上运行部署清单。使用部署清单时，请为每个应用程序创建一个站点存档，然后将该站点存档捆绑在包含部署清单的另一个 ZIP 存档中。

部署清单还增加了[在不同路径上运行多个应用程序](#dotnet-manifest-multiapp)的能力。一个部署清单定义了一组部署目标，每个部署目标有一个站点存档和一个 IIS 应在其上运行部署清单的路径。例如，您可以在 `/api` 路径上运行 Web API，以服务异步请求，以及使用 API 的根路径上的 Web 应用程序。

您可以使用部署清单来[配置使用自定义绑定和物理路径的 IIS 网站](#dotnet-manifest-websites)。这样，您便可在部署应用程序之前设置用于侦听特定端口或主机名的网站。

您也可以使用部署清单[通过在 IIS 或 Kestrel 中的应用程序池运行多个应用程序](#dotnet-manifest-apppool)。您可以将应用程序池配置为定期重启应用程序、运行 32 位应用程序或使用特定版本的 .NET 框架运行时。

要进行完全自定义，您可以在 Windows 中[编写自己的部署脚本](#dotnet-manifest-custom)， PowerShell 然后告诉 Elastic Beanstalk 要运行哪些脚本来安装、卸载和重启应用程序。

部署清单和相关功能需要 Windows Server 平台[版本 1.2.0 或更新版本](dotnet-v2migration.md)。

有关所有可用配置选项、属性和高级功能（例如跳过 IIS 重置）的详细信息，请参阅[部署清单架构参考](dotnet-manifest-schema.md)。

**Topics**
+ [.NET Core 应用程序](#dotnet-manifest-dotnetcore)
+ [运行多个应用程序](#dotnet-manifest-multiapp)
+ [配置 IIS 网站](#dotnet-manifest-websites)
+ [使用应用程序请求路由（ARR）](#dotnet-manifest-arr)
+ [配置应用程序池](#dotnet-manifest-apppool)
+ [定义自定义部署](#dotnet-manifest-custom)
+ [部署清单架构参考](dotnet-manifest-schema.md)

## .NET Core 应用程序
<a name="dotnet-manifest-dotnetcore"></a>

您可以使用部署清单在 Elastic Beanstalk 上运行 .NET Core 应用程序。.NET Core 是 .NET 的跨平台版本，它附带一个命令行工具 (`dotnet`)。您可以使用它生成一个应用程序、在本地运行该应用程序并做好发布该应用程序的准备。

要在 Elastic Beanstalk 上运行 .NET Core 应用程序，您可以运行 `dotnet publish` 并将 ZIP 存档中的输出打包，而不包括任何包含的目录。将具有部署清单的源包中的站点存档与类型为 `aspNetCoreWeb` 的部署目标放在一起。

以下部署清单将在根路径上运行一个来自名为 `dotnet-core-app.zip` 的站点存档的 .NET 内核应用程序。

**Example aws-windows-deployment-manifest.json-.NET 核心**  

```
{
  "manifestVersion": 1,
  "deployments": {
    "aspNetCoreWeb": [
      {
        "name": "my-dotnet-core-app",
        "parameters": {
          "archive": "dotnet-core-app.zip",
          "iisPath": "/"
        }
      }
    ]
  }
}
```

将清单和站点存档捆绑在一个 ZIP 文档中，以创建源包。

**Example dotnet-core-bundle.zip**  

```
.
|-- aws-windows-deployment-manifest.json
`-- dotnet-core-app.zip
```

该站点存档包含已编译的应用程序代码、依赖项和 `web.config` 文件。

**Example dotnet-core-app.zip**  

```
.
|-- Microsoft.AspNetCore.Hosting.Abstractions.dll
|-- Microsoft.AspNetCore.Hosting.Server.Abstractions.dll
|-- Microsoft.AspNetCore.Hosting.dll
|-- Microsoft.AspNetCore.Http.Abstractions.dll
|-- Microsoft.AspNetCore.Http.Extensions.dll
|-- Microsoft.AspNetCore.Http.Features.dll
|-- Microsoft.AspNetCore.Http.dll
|-- Microsoft.AspNetCore.HttpOverrides.dll
|-- Microsoft.AspNetCore.Server.IISIntegration.dll
|-- Microsoft.AspNetCore.Server.Kestrel.dll
|-- Microsoft.AspNetCore.WebUtilities.dll
|-- Microsoft.Extensions.Configuration.Abstractions.dll
|-- Microsoft.Extensions.Configuration.EnvironmentVariables.dll
|-- Microsoft.Extensions.Configuration.dll
|-- Microsoft.Extensions.DependencyInjection.Abstractions.dll
|-- Microsoft.Extensions.DependencyInjection.dll
|-- Microsoft.Extensions.FileProviders.Abstractions.dll
|-- Microsoft.Extensions.FileProviders.Physical.dll
|-- Microsoft.Extensions.FileSystemGlobbing.dll
|-- Microsoft.Extensions.Logging.Abstractions.dll
|-- Microsoft.Extensions.Logging.dll
|-- Microsoft.Extensions.ObjectPool.dll
|-- Microsoft.Extensions.Options.dll
|-- Microsoft.Extensions.PlatformAbstractions.dll
|-- Microsoft.Extensions.Primitives.dll
|-- Microsoft.Net.Http.Headers.dll
|-- System.Diagnostics.Contracts.dll
|-- System.Net.WebSockets.dll
|-- System.Text.Encodings.Web.dll
|-- dotnet-core-app.deps.json
|-- dotnet-core-app.dll
|-- dotnet-core-app.pdb
|-- dotnet-core-app.runtimeconfig.json
`-- web.config
```

## 运行多个应用程序
<a name="dotnet-manifest-multiapp"></a>

您可以定义多个部署目标，从而使用一个部署清单运行多个应用程序。

以下部署清单配置两个 .NET Core 应用程序。`WebApiSampleApp` 应用程序实现一个简单的 Web API 并在 `/api` 路径提供异步请求。`DotNetSampleApp` 应用程序是在根路径上服务请求的 Web 应用程序。

**Example aws-windows-deployment-manifest.json-多个应用程序**  

```
{
  "manifestVersion": 1,
  "deployments": {
    "aspNetCoreWeb": [
      {
        "name": "WebAPISample",
        "parameters": {
          "appBundle": "WebApiSampleApp.zip",
          "iisPath": "/api"
        }
      },
      {
        "name": "DotNetSample",
        "parameters": {
          "appBundle": "DotNetSampleApp.zip",
          "iisPath": "/"
        }
      }
    ]
  }
}
```

此处提供了一个具有多个应用场合的示例应用程序：
+ **可部署的源代码包** [--v2.zip dotnet-multiapp-sample-bundle](samples/dotnet-multiapp-sample-bundle-v2.zip)
+ **源代码**-[dotnet-multiapp-sample-source-v2.zip](samples/dotnet-multiapp-sample-source-v2.zip)

## 配置 IIS 网站
<a name="dotnet-manifest-websites"></a>

您可以使用部署清单来配置使用自定义绑定和物理路径的 IIS 网站。当您需要设置用于侦听特定端口、使用自定义主机名或提供来自特定目录内容的网站时，这很有用。

以下部署清单配置了使用特定端口号和自定义物理路径来侦听 HTTP 的自定义 IIS 网站：

**Example aws-windows-deployment-manifest.json-IIS 网站配置**  

```
{
  "manifestVersion": 1,
  "iisConfig": {
    "websites": [
      {
        "name": "MyCustomSite",
        "physicalPath": "C:\inetpub\wwwroot\mysite",
        "bindings": [
          {
            "protocol": "http",
            "port": 8080,
            "hostName": "mysite.local"
          }
        ]
      }
    ]
  },
  "deployments": {
    "aspNetCoreWeb": [
      {
        "name": "my-dotnet-core-app",
        "parameters": {
          "appBundle": "dotnet-core-app.zip",
          "iisWebSite": "MyCustomSite",
          "iisPath": "/"
        }
      }
    ]
  }
}
```

在本示例中：
+ 使用自定义物理路径创建名为 MyCustomSite “” 的网站
+ 该网站在端口 8080 上具有 HTTP 绑定，并具有特定的主机名
+ ASP.NET Core 应用程序使用 `iisWebSite` 参数部署到此自定义网站

## 使用应用程序请求路由（ARR）
<a name="dotnet-manifest-arr"></a>

应用程序请求路由 (ARR) 和 URL 重写模块已预先安装并在 Elastic Beanstalk Windows 中可用。 AMIs这些模块使用 ebextensions 或应用程序配置，通过 IIS 配置实现高级路由场景和 URL 操作。

以下示例显示了简单的部署清单，该清单使用自定义端口，并结合用于设置基本 ARR 路由的 ebextensions 配置，对网站进行了配置：

**Example aws-windows-deployment-manifest.json-简单的 ARR 设置**  

```
{
  "manifestVersion": 1,
  "iisConfig": {
    "websites": [
      {
        "name": "ARRSite",
        "physicalPath": "C:\\inetpub\\wwwroot\\arrsite",
        "bindings": [
          {
            "protocol": "http",
            "port": 8080,
            "hostName": "localhost"
          }
        ]
      }
    ]
  },
  "deployments": {
    "aspNetCoreWeb": [
      {
        "name": "BackendApp",
        "parameters": {
          "appBundle": "backend-app.zip",
          "iisWebSite": "ARRSite",
          "iisPath": "/backend"
        }
      }
    ]
  }
}
```

ARR 配置通过 ebextensions 完成。以下配置对基本 ARR 路由规则进行了设置：

**Example .ebextensions/arr-config.config – 基本 ARR 配置**  

```
files:
  "C:\\temp\\configure-arr.ps1":
    content: |
      # Enable ARR proxy at server level
      Set-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter 'system.webServer/proxy' -Name 'enabled' -Value 'True'
      
      # Clear any existing global rules to avoid conflicts
      Clear-WebConfiguration -PSPath 'MACHINE/WEBROOT/APPHOST' -Filter 'system.webServer/rewrite/globalRules'

      # Add global rule to route all requests to backend
      Add-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' `
        -Filter 'system.webServer/rewrite/globalRules' `
        -Name '.' `
        -Value @{
          name = 'Route_to_Backend'
          stopProcessing = 'True'
          match = @{ url = '^(?!backend/)(.*)' }
          action = @{
            type = 'Rewrite'
            url = 'http://localhost:8080/backend/{R:1}'
          }
        }

container_commands:
  01_configure_arr:
    command: powershell -ExecutionPolicy Bypass -File "C:\\temp\\configure-arr.ps1"
    waitAfterCompletion: 0
```

此配置在端口 8080 上创建网站，并将 ARR 设置为将所有传入请求路由到在该站点上运行的后端应用程序。

## 配置应用程序池
<a name="dotnet-manifest-apppool"></a>

您可以在 Windows 环境中支持多个应用程序。有两种方法可供选择：
+ 您可以将 out-of-process托管模式与 Kestrel 网络服务器配合使用。使用此模型，您可以配置多个应用程序以在一个应用程序池中运行。
+ 您可以使用进程内托管模式。使用此模型，您可以使用多个应用程序池运行多个应用程序，每个池中只有一个应用程序。如果您使用的是 IIS 服务器并且需要运行多个应用程序，则必须使用此方法。

要将 Kesttrel 配置为在一个应用程序池中运行多个应用程序，请在 `hostingModel="OutofProcess"` 文件中添加 `web.config`。考虑以下示例。

**Example web.config-适用于 Ke out-of-process strel 托管模型**  

```
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add 
    name="aspNetCore" 
    path="*" verb="*" 
    modules="AspNetCoreModuleV2" 
    resourceType="Unspecified" />
</handlers>
<aspNetCore 
    processPath="dotnet" 
    arguments=".\CoreWebApp-5-0.dll" 
    stdoutLogEnabled="false" 
    stdoutLogFile=".\logs\stdout" 
    hostingModel="OutofProcess" />
</system.webServer>
</location>
</configuration>
```

**Example aws-windows-deployment-manifest.json-多个应用程序**  

```
{
"manifestVersion": 1,
  "deployments": {"msDeploy": [
      {"name": "Web-app1",
        "parameters": {"archive": "site1.zip",
          "iisPath": "/"
        }
      },
      {"name": "Web-app2",
        "parameters": {"archive": "site2.zip",
          "iisPath": "/app2"
        }
      }
    ]
  }
}
```

IIS 不支持一个应用程序池中的多个应用程序，因为它使用进程内托管模型。因此，您需要通过将每个应用程序分配到一个应用程序池来配置多个应用程序。换句话说，只将一个应用程序分配到一个应用程序池。

您可以将 IIS 配置为在 `aws-windows-deployment-manifest.json` 文件中使用不同的应用程序池。在参考下一个示例文件时进行以下更新：
+ 添加 `iisConfig` 部分，该部分包含称为 `appPools` 的子部分。
+ 在 `appPools` 数据块中，列出应用程序池。
+ 在 `deployments` 部分中，为每个应用程序定义 `parameters` 部分。
+ 对于每个应用程序，`parameters` 部分都将指定一个存档、一个运行该存档的路径以及要在其中运行的 `appPool` 。

以下部署清单配置了两个应用程序池，它们每 10 分钟重新启动一次应用程序。他们还将应用程序附加到以指定路径运行的 .NET Framework Web 应用程序。

**Example aws-windows-deployment-manifest.json-每个应用程序池一个应用程序**  

```
{
"manifestVersion": 1,
  "iisConfig": {"appPools": [
      {"name": "MyFirstPool",
       "recycling": {"regularTimeInterval": 10}
      },
      {"name": "MySecondPool",
       "recycling": {"regularTimeInterval": 10}
      }
     ]
    },
  "deployments": {"msDeploy": [
      {"name": "Web-app1",
        "parameters": {
           "archive": "site1.zip",
           "iisPath": "/",
           "appPool": "MyFirstPool"
           }
      },
      {"name": "Web-app2",
        "parameters": {
           "archive": "site2.zip",
           "iisPath": "/app2",
           "appPool": "MySecondPool"
          }
      }
     ]
    }
}
```

## 定义自定义部署
<a name="dotnet-manifest-custom"></a>

为了实现更多控制，您可以通过定义*自定义部署* 来完全自定义应用程序部署。

此部署清单指示 Elastic Beanstalk 在 32 位模式下执行脚 PowerShell 本。它指定了三个脚本：一个`install`在实例启动和部署期间运行的`uninstall`脚本 (`siteUninstall.ps1`)，一个在部署期间安装新版本之前执行的`restart`脚本 (`siteRestart.ps1`)，以及在 Amazon 管理控制台中选择 “[重新启动应用服务器](environments-dashboard-actions.md)” 时运行的脚本 ()。`siteInstall.ps1`

**Example aws-windows-deployment-manifest.json-自定义部署**  

```
{
  "manifestVersion": 1,
  "deployments": {
    "custom": [
      {
        "name": "Custom site",
        "architecture" : 32,
        "scripts": {
          "install": {
            "file": "siteInstall.ps1"
          },
          "restart": {
            "file": "siteRestart.ps1"
          },
          "uninstall": {
            "file": "siteUninstall.ps1"
          }
        }
      }
    ]
  }
}
```

包括使用清单和脚本运行源包中的应用程序所需的任何项目。

**Example C ustom-site-bundle .zip**  

```
.
|-- aws-windows-deployment-manifest.json
|-- siteInstall.ps1
|-- siteRestart.ps1
|-- siteUninstall.ps1
`-- site-contents.zip
```