

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

# 对 .NET 和 Elastic Beanstalk 的多应用程序支持
<a name="deployment-beanstalk-multiple-application"></a>

通过使用部署清单，您能够将多个应用程序部署到同一 Elastic Beanstalk 环境。

部署清单支持 [ASP.NET 内核](http://www.asp.net/core) Web 应用程序以及用于传统 ASP.NET 应用程序的 msdeploy 存档。设想以下情形：您为前端编写了一个使用 ASP.NET 内核的很棒的新应用程序并为扩展 API 编写了一个 Web API 项目。您还有一个使用传统 ASP.NET 编写的管理应用程序。

工具包的部署向导侧重于部署单一项目。要利用多应用程序部署，您必须手动构造应用程序包。要开始，请写入清单。在本示例中，您将在解决方案的根部写入清单。

清单中的部署部分包含两个子级：要部署的 ASP.NET 内核 Web 应用程序的数组以及要部署的 msdeploy 存档的数组。对于每个应用程序，您应设置应用程序的位相对于清单的 IIS 路径和位置。

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

    "aspNetCoreWeb": [
      {
        "name": "frontend",
        "parameters": {
          "appBundle": "./frontend",
          "iisPath": "/frontend"
        }
      },
      {
        "name": "ext-api",
        "parameters": {
          "appBundle": "./ext-api",
          "iisPath": "/ext-api"
        }
      }
    ],
    "msDeploy": [
      {
        "name": "admin",
        "parameters": {
          "appBundle": "AmazingAdmin.zip",
          "iisPath": "/admin"
        }
      }
    ]
  }
}
```

在写入清单后，您将使用 Windows PowerShell 创建应用程序包并更新现有 Elastic Beanstalk 环境以运行此包。写入脚本时将假定它在包含您的 Visual Studio 解决方案的文件夹中运行。

您在脚本中需要执行的一个操作是设置在其中创建应用程序包的工作区文件夹。

```
$publishFolder = "c:\temp\publish"

$publishWorkspace = [System.IO.Path]::Combine($publishFolder, "workspace")
$appBundle = [System.IO.Path]::Combine($publishFolder, "app-bundle.zip")

If (Test-Path $publishWorkspace){
  Remove-Item $publishWorkspace -Confirm:$false -Force
}
If (Test-Path $appBundle){
  Remove-Item $appBundle -Confirm:$false -Force
}
```

创建此文件夹后，是时候为前端做好准备了。与使用部署向导时一样，应使用 dotnet CLI 来发布应用程序。

```
Write-Host 'Publish the ASP.NET Core frontend'
$publishFrontendFolder = [System.IO.Path]::Combine($publishWorkspace, "frontend")
dotnet publish .\src\AmazingFrontend\project.json -o $publishFrontendFolder -c Release -f netcoreapp1.0
```

请注意，子文件夹“frontend”用于输出文件夹 (与您在清单中设置的文件夹匹配)。现在您需要对 Web API 项目执行相同的操作。

```
Write-Host 'Publish the ASP.NET Core extensibility API'
$publishExtAPIFolder = [System.IO.Path]::Combine($publishWorkspace, "ext-api")
dotnet publish .\src\AmazingExtensibleAPI\project.json -o $publishExtAPIFolder -c Release -f netcoreapp1.0
```

管理员站点是传统 ASP.NET 应用程序，因此您无法使用 dotnet CLI。对于管理应用程序，您应使用在生成目标包中传递的 msbuild 来创建 msdeploy 存档。默认情况下，包目标将在 `obj\Release\Package` 文件夹下创建 msdeploy 存档，因此您需要将此存档部署到发布工作区。

```
Write-Host 'Create msdeploy archive for admin site'
msbuild .\src\AmazingAdmin\AmazingAdmin.csproj /t:package /p:Configuration=Release
Copy-Item .\src\AmazingAdmin\obj\Release\Package\AmazingAdmin.zip $publishWorkspace
```

要告知 Elastic Beanstalk 环境如何处理所有这些应用程序，请将此清单从您的解决方案复制到发布工作区，然后压缩文件夹。

```
Write-Host 'Copy deployment manifest'
Copy-Item .\aws-windows-deployment-manifest.json $publishWorkspace

Write-Host 'Zipping up publish workspace to create app bundle'
Add-Type -assembly "system.io.compression.filesystem"
[io.compression.zipfile]::CreateFromDirectory( $publishWorkspace, $appBundle)
```

现在您已拥有应用程序包，您可转到 Web 控制台并将存档上传到 Elastic Beanstalk 环境。或者，您也可以继续使用 AWS PowerShell cmdlet，用应用程序包更新 Elastic Beanstalk 环境。确保您使用 `Set-AWSCredentials` 和 `Set-DefaultAWSRegion` cmdlet 将当前配置文件和区域设置为包含您的 Elastic Beanstalk 环境的配置文件和区域。

```
Write-Host 'Write application bundle to S3'
# Determine S3 bucket to store application bundle
$s3Bucket = New-EBStorageLocation
Write-S3Object -BucketName $s3Bucket -File $appBundle


$applicationName = "ASPNETCoreOnAWS"
$environmentName = "ASPNETCoreOnAWS-dev"
$versionLabel = [System.DateTime]::Now.Ticks.ToString()

Write-Host 'Update Beanstalk environment for new application bundle'
New-EBApplicationVersion -ApplicationName $applicationName -VersionLabel $versionLabel -SourceBundle_S3Bucket $s3Bucket -SourceBundle_S3Key app-bundle.zip
Update-EBEnvironment -ApplicationName $applicationName -EnvironmentName $environmentName -VersionLabel $versionLabel
```

现在，通过在 Toolkit 或 Web 控制台中使用 Elastic Beanstalk 环境状态页面来检查更新状态。完成后，您将能够导航到部署于在部署清单中设置的 IIS 路径的所有应用程序。