

# 部署 ASP.NET 应用程序
<a name="csharp-package-asp"></a>

除了托管事件驱动型函数外，您还可以将 .NET 与 Lambda 结合使用来托管轻量级 ASP.NET 应用程序。您可以使用 `Amazon.Lambda.AspNetCoreServer` NuGet 包构建和部署 ASP.NET 应用程序。在本节中，您将学习如何使用 .NET Lambda CLI 工具将 ASP.NET Web API 部署到 Lambda。

**Topics**
+ [先决条件](#csharp-package-asp-prerequisites)
+ [将 ASP.NET Web API 部署到 Lambda](#csharp-package-asp-deploy-api)
+ [将 ASP.NET 最小 API 部署到 Lambda](#csharp-package-asp-deploy-minimal)

## 先决条件
<a name="csharp-package-asp-prerequisites"></a>

**.NET 8 SDK**  
安装 [.NET 8](https://dotnet.microsoft.com/en-us/download/dotnet/8.0) SDK 和 ASP.NET Core 运行时系统。

**Amazon.Lambda.Tools**  
要创建您的 Lambda 函数，请使用 [https://www.nuget.org/packages/Amazon.Lambda.Tools](https://www.nuget.org/packages/Amazon.Lambda.Tools) [.NET 全球工具扩展](https://aws.amazon.com/blogs/developer/net-core-global-tools-for-aws/)。要安装 Amazon.Lambda.Tools，请运行以下命令：  

```
dotnet tool install -g Amazon.Lambda.Tools
```
有关 Amazon.Lambda.Tools .NET CLI 扩展的更多信息，请参阅 GitHub 上的[适用于 .NET CLI 的 AWS 扩展](https://github.com/aws/aws-extensions-for-dotnet-cli)存储库。

**Amazon.Lambda.Templates**  
要生成您的 Lambda 函数代码，请使用 [https://www.nuget.org/packages/Amazon.Lambda.Templates](https://www.nuget.org/packages/Amazon.Lambda.Templates) NuGet 包。要安装此模板包，请运行以下命令：  

```
dotnet new --install Amazon.Lambda.Templates
```

## 将 ASP.NET Web API 部署到 Lambda
<a name="csharp-package-asp-deploy-api"></a>

要使用 ASP.NET 部署 Web API，您可以使用 .NET Lambda 模板创建新的 Web API 项目。使用以下命令初始化新的 ASP.NET Web API 项目。在示例命令中，我们将项目命名为 `AspNetOnLambda`。

```
dotnet new serverless.AspNetCoreWebAPI -n AspNetOnLambda
```

此命令在您的项目目录中创建了以下文件和目录。

```
.
└── AspNetOnLambda
    ├── src
    │   └── AspNetOnLambda
    │       ├── AspNetOnLambda.csproj
    │       ├── Controllers
    │       │   └── ValuesController.cs
    │       ├── LambdaEntryPoint.cs
    │       ├── LocalEntryPoint.cs
    │       ├── Readme.md
    │       ├── Startup.cs
    │       ├── appsettings.Development.json
    │       ├── appsettings.json
    │       ├── aws-lambda-tools-defaults.json
    │       └── serverless.template
    └── test
        └── AspNetOnLambda.Tests
            ├── AspNetOnLambda.Tests.csproj
            ├── SampleRequests
            │   └── ValuesController-Get.json
            ├── ValuesControllerTests.cs
            └── appsettings.json
```

当 Lambda 调用您的函数时，它使用的入口点是 `LambdaEntryPoint.cs` 文件。由 .NET Lambda 模板创建的文件包含以下代码。

```
namespace AspNetOnLambda;

public class LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
{
    protected override void Init(IWebHostBuilder builder)
    {
        builder
            .UseStartup≪Startup≫();
    }

    protected override void Init(IHostBuilder builder)
    {
    }
}
```

Lambda 使用的入口点必须继承自 `Amazon.Lambda.AspNetCoreServer` 包中的三个基类之一。这三个基类为：
+ `APIGatewayProxyFunction`
+ `APIGatewayHttpApiV2ProxyFunction`
+ `ApplicationLoadBalancerFunction`

使用提供的 .NET Lambda 模板创建 `LambdaEntryPoint.cs` 文件时使用的默认类是 `APIGatewayProxyFunction`。您在函数中所使用的基类取决于您的 Lambda 函数前面是哪个 API 层。

三个基类中的每一个都包含一个名为 `FunctionHandlerAsync` 的公共方法。此方法的名称将构成 Lambda 用于调用函数的[处理程序字符串](csharp-handler.md#csharp-class-library-handlers)的一部分。`FunctionHandlerAsync` 方法将入站事件有效负载转换为正确的 ASP.NET 格式，将 ASP.NET 响应转换回 Lambda 响应有效负载。对于所示的示例 `AspNetOnLambda` 项目，处理程序字符串将如下所示。

```
AspNetOnLambda::AspNetOnLambda.LambdaEntryPoint::FunctionHandlerAsync
```

要将 API 部署到 Lambda，请运行以下命令导航到包含源代码文件的目录并使用 CloudFormation 部署您的函数。

```
cd AspNetOnLambda/src/AspNetOnLambda
dotnet lambda deploy-serverless
```

**提示**  
使用 `dotnet lambda deploy-serverless` 命令部署 API 时，CloudFormation 会根据您在部署期间指定的堆栈名称为您的 Lambda 函数命名。要为您的 Lambda 函数指定自定义名称，请编辑 `serverless.template` 文件以向 `AWS::Serverless::Function` 资源添加 `FunctionName` 属性。要了解更多信息，请参阅《CloudFormation 用户指南》**中的[名称类型](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-name.html)。

## 将 ASP.NET 最小 API 部署到 Lambda
<a name="csharp-package-asp-deploy-minimal"></a>

要将 ASP.NET 最小 API 部署到 Lambda，您可以使用 .NET Lambda 模板创建新的 API 项目。使用以下命令初始化新的最小 API 项目。在此示例中，我们将项目命名为 `MinimalApiOnLambda`。

```
dotnet new serverless.AspNetCoreMinimalAPI -n MinimalApiOnLambda
```

此命令在您的项目目录中创建以下文件和目录。

```
└── MinimalApiOnLambda
    └── src
        └── MinimalApiOnLambda
            ├── Controllers
            │   └── CalculatorController.cs
            ├── MinimalApiOnLambda.csproj
            ├── Program.cs
            ├── Readme.md
            ├── appsettings.Development.json
            ├── appsettings.json
            ├── aws-lambda-tools-defaults.json
            └── serverless.template
```

`Program.cs` 文件包含以下代码。

```
var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllers();

// Add AWS Lambda support. When application is run in Lambda Kestrel is swapped out as the web server with Amazon.Lambda.AspNetCoreServer. This
// package will act as the webserver translating request and responses between the Lambda event source and ASP.NET Core.
builder.Services.AddAWSLambdaHosting(LambdaEventSource.RestApi);

var app = builder.Build();


app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();

app.MapGet("/", () => "Welcome to running ASP.NET Core Minimal API on AWS Lambda");

app.Run();
```

要将您的最小 API 配置为在 Lambda 上运行，您可能需要对此代码进行编辑，以便正确翻译 Lambda 和 ASP.NET Core 之间的请求和响应。默认情况下，该函数是针对 REST API 事件源进行配置的。对于 HTTP API 或应用程序负载均衡器，请将 `(LambdaEventSource.RestApi)` 替换为以下选项之一：
+ `(LambdaEventSource.HttpAPi)`
+ `(LambdaEventSource.ApplicationLoadBalancer)`

要将您的最小 API 部署到 Lambda，请运行以下命令导航到包含源代码文件的目录并使用 CloudFormation 部署您的函数。

```
cd MinimalApiOnLambda/src/MinimalApiOnLambda
dotnet lambda deploy-serverless
```