Amazon.Lambda.AspNetCoreServer 9.0.0
Prefix Reserved
dotnet add package Amazon.Lambda.AspNetCoreServer --version 9.0.0
NuGet\Install-Package Amazon.Lambda.AspNetCoreServer -Version 9.0.0
<PackageReference Include="Amazon.Lambda.AspNetCoreServer" Version="9.0.0" />
paket add Amazon.Lambda.AspNetCoreServer --version 9.0.0
#r "nuget: Amazon.Lambda.AspNetCoreServer, 9.0.0"
// Install Amazon.Lambda.AspNetCoreServer as a Cake Addin #addin nuget:?package=Amazon.Lambda.AspNetCoreServer&version=9.0.0 // Install Amazon.Lambda.AspNetCoreServer as a Cake Tool #tool nuget:?package=Amazon.Lambda.AspNetCoreServer&version=9.0.0
Amazon.Lambda.AspNetCoreServer
此包使运行 ASP.NET Core Web API 应用程序作为 Lambda 函数(使用 API Gateway 或 ELB 应用程序负载均衡器)变得简单。这使得 .NET Core 开发人员可以使用 ASP.NET Core Web API 框架创建“无服务器”应用程序。
函数从 API Gateway 代理 或从 应用程序负载均衡器 中接收请求,将该请求转换为 ASP.NET Core 框架期望的类,然后将来自 ASP.NET Core 框架的响应转换为 API Gateway 代理或应用程序负载均衡器可以理解的响应体。
Lambda 入口点
在 ASP.NET Core 应用程序中添加一个类,作为 Lambda 调用应用程序的入口点。这个类通常被称为 LambdaEntryPoint
。基于 Lambda 函数的调用方式来决定基类。
Lambda 调用 | 基类 |
---|---|
API 网关 REST API | APIGatewayProxyFunction |
API 网关 WebSocket API | APIGatewayProxyFunction |
API 网关 HTTP API 有效载荷 1.0 | APIGatewayProxyFunction |
API 网关 HTTP API 有效载荷 2.0 | APIGatewayHttpApiV2ProxyFunction |
应用程序负载均衡器 | ApplicationLoadBalancerFunction |
注意:HTTP API 默认为载荷 2.0,除非明确设置为 1.0,否则基类应该是 APIGatewayHttpApiV2ProxyFunction。
下面是一个在 ASP.NET Core Web API 应用程序中实现的 Lambda 函数示例。
using System.IO;
using Amazon.Lambda.AspNetCoreServer;
using Microsoft.AspNetCore.Hosting;
namespace TestWebApp
{
/// <summary>
/// This class extends from APIGatewayProxyFunction which contains the method FunctionHandlerAsync which is the
/// actual Lambda function entry point. The Lambda handler field should be set to
///
/// AWSServerless19::AWSServerless19.LambdaEntryPoint::FunctionHandlerAsync
/// </summary>
public class LambdaEntryPoint :
// The base class must be set to match the AWS service invoking the Lambda function. If not Amazon.Lambda.AspNetCoreServer
// will fail to convert the incoming request correctly into a valid ASP.NET Core request.
//
// API Gateway REST API -> Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
// API Gateway HTTP API payload version 1.0 -> Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
// API Gateway HTTP API payload version 2.0 -> Amazon.Lambda.AspNetCoreServer.APIGatewayHttpApiV2ProxyFunction
// Application Load Balancer -> Amazon.Lambda.AspNetCoreServer.ApplicationLoadBalancerFunction
//
// Note: When using the AWS::Serverless::Function resource with an event type of "HttpApi" then payload version 2.0
// will be the default and you must make Amazon.Lambda.AspNetCoreServer.APIGatewayHttpApiV2ProxyFunction the base class.
Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
{
/// <summary>
/// The builder has configuration, logging and Amazon API Gateway already configured. The startup class
/// needs to be configured in this method using the UseStartup<>() method.
/// </summary>
/// <param name="builder"></param>
protected override void Init(IWebHostBuilder builder)
{
builder
.UseStartup<Startup>();
}
}
}
Lambda 函数的处理程序将是 TestWebApp::TestWebApp.LambdaEntryPoint::FunctionHandlerAsync。
应用程序启动(IWebHostBuilder 与 IHostBuilder)
ASP.NET Core 应用程序通过使用宿主构建器进行启动。宿主构建器用于配置运行 ASP.NET Core 应用程序所需的所有必需服务。使用 Amazon.Lambda.AspNetCoreServer,有多个选项可以自定义启动过程,并且这些选项因目标版本的 .NET Core 而异。
ASP.NET Core 3.1
ASP.NET Core 3.1 使用泛型 IHostBuilder
来启动应用程序。在典型的 ASP.NET Core 3.1 应用程序中,使用以下代码片段所示的 Program.cs
文件启动应用程序。作为创建 IHostBuilder
的过程的一部分,通过 ConfigureWebHostDefaults
方法创建了一个 IWebHostBuilder
。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Amazon.Lambda.AspNetCoreServer 创建了这个 IHostBuilder
并配置了在 Lambda 中运行 ASP.NET Core 应用程序所需的默认设置。
可以重写两个 Init
方法来自定义 IHostBuilder
。最常见的自定义是通过重写 Init(IWebHostBuilder)
方法,并通过 UseStartup
方法设置启动类。要自定义 IHostBuilder
,请重写 Init(IHostBuilder)
。**不要在重写 Init(IHostBuilder)
时调用 ConfigureWebHostDefaults
,因为 Amazon.Lambda.AspNetCoreServer 在创建 IHostBuilder
时会调用 ConfigureWebHostDefaults
。在 Init(IHostBuilder)
方法中调用 ConfigureWebHostDefaults
将导致 IWebHostBuilder
配置两次**。
如果想要完全控制创建 IHostBuilder
的过程,则可以重写 CreateHostBuilder
方法。当重写 CreateHostBuilder
方法时,除非重写调用基本实现或显式调用 Init(IWebHostBuilder)
方法,否则不会调用任一 Init
方法。当重写 CreateHostBuilder
方法时,建议调用 ConfigureWebHostLambdaDefaults
而不是 ConfigureWebHostDefaults
来配置 Lambda 中的 IWebHostBuilder
。
如果在一个 ASP.NET Core 3.1 应用程序中重写了 CreateWebHostBuilder
,则只使用 IWebHostBuilder
进行启动,采用与 ASP.NET Core 2.1 应用程序相同的模式。当重写 CreateWebHostBuilder
时,不会调用 CreateHostBuilder
和 Init(IHostBuilder)
。
ASP.NET Core 2.1
ASP.NET Core 2.1 应用程序使用 IWebHostBuilder
类型进行启动。Amazon.Lambda.AspNetCoreServer 将创建一个 IWebHostBuilder
实例,可以通过重写 Init(IWebHostBuilder)
方法来自定义它。最常见的自定义是通过 UseStartup
方法配置启动类。
如果想要完全控制创建 IWebHostBuilder
的过程,请重写 方法。当重写
CreateWebHostBuilder
方法时,除非重写调用基本实现或显式调用 Init(IWebHostBuilder)
方法,否则不会调用 Init(IWebHostBuilder)
方法。
从 HttpContext 访问 Lambda 对象
可以从 HttpContext.Items
集合访问原始 Lambda 请求对象和 ILambdaContext
对象。
常量 | 对象 |
---|---|
AbstractAspNetCoreFunction.LAMBDA_CONTEXT | ILambdaContext |
AbstractAspNetCoreFunction.LAMBDA_REQUEST_OBJECT | <ul><li>APIGatewayProxyFunction → APIGatewayProxyRequest</li><li>APIGatewayHttpApiV2ProxyFunction → APIGatewayHttpApiV2ProxyRequest</li><li>ApplicationLoadBalancerFunction → ApplicationLoadBalancerRequest</li></ul> |
JSON序列化
从版本5.0.0开始,如果目标是.NET Core 3.1,将使用Amazon.Lambda.Serialization.SystemTextJson
。如果目标是之前版本的.NET Core或使用版本小于5.0.0的Amazon.Lambda.AspNetCoreServer,将使用Amazon.Lambda.Serialization.Json
。
Web应用程序路径基础
默认情况下,该包配置入站请求数据的路径基础为API网关阶段的根路径或应用程序负载均衡器。
如果要将资源路径中的子资源处理为路径基础,则需要修改请求如何导入ASP.NET Core的方式。例如,如果应用程序负载均衡器的监听器指向以/webapp/*
开始的Lambda目标组,并且您想调用控制器api/values
,则ASP.NET Core会认为您要访问的资源是/webapp/api/values
,这将返回404NotFound错误。
在LambdaEntryPoint
类中,您可以重写PostMarshallRequestFeature
方法以添加自定义逻辑到路径基础的计算方式。以下示例配置路径基础为/webapp/
。当应用程序负载均衡器发送一个设置资源路径为/webapp/api/values的请求时,此代码配置ASP.NET Core请求将路径基础设置为/webapp/并将路径设置为/api/values。
public class LambdaEntryPoint : ApplicationLoadBalancerFunction
{
protected override void Init(IWebHostBuilder builder)
{
builder
.UseStartup<Startup>();
}
protected override void PostMarshallRequestFeature(IHttpRequestFeature aspNetCoreRequestFeature, ApplicationLoadBalancerRequest lambdaRequest, ILambdaContext lambdaContext)
{
aspNetCoreRequestFeature.PathBase = "/webapp/";
// The minus one is ensure path is always at least set to `/`
aspNetCoreRequestFeature.Path =
aspNetCoreRequestFeature.Path.Substring(aspNetCoreRequestFeature.PathBase.Length - 1);
lambdaContext.Logger.LogLine($"Path: {aspNetCoreRequestFeature.Path}, PathBase: {aspNetCoreRequestFeature.PathBase}");
}
}
支持二进制响应内容
API网关/应用程序负载均衡器与Lambda之间的接口假设响应内容以UTF-8字符串返回。为了返回二进制内容,需要将原始响应内容编码为Base64,并在响应对象中设置一个标志以指示已经应用了Base64编码。
为了方便这一机制,基类维护了一个MIME内容类型的注册表,以及它们在被返回到调用API网关或应用程序负载均衡器之前应该如何转换。对于您的应用程序返回的任何二进制内容类型,您应该将它们注册为Base64转换,然后框架将负责拦截所有此类响应并进行必要的转换以保留二进制内容。例如
using System.IO;
using Amazon.Lambda.AspNetCoreServer;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
namespace TestWebApp
{
public class LambdaFunction : APIGatewayProxyFunction
{
protected override void Init(IWebHostBuilder builder)
{
// Register any MIME content types you want treated as binary
RegisterResponseContentEncodingForContentType("application/octet-stream",
ResponseContentEncoding.Base64);
// ...
}
}
// In your controller actions, be sure to provide a Content Type for your responses
public class LambdaController : Controller
{
public IActionResult GetBinary()
{
var binData = new byte[] { 0x00, 0x01, 0x02, 0x03 };
return base.File(binData, "application/octet-stream");
}
}
}
重要 - 在API网关中注册二进制响应
为了使用此机制来返回二进制响应内容,除了将应用程序将要返回的任何二进制MIME内容类型进行注册外,还需要使用控制台或REST接口将相同的内容类型注册到API网关中。
对于应用程序负载均衡器,这一步骤不是必须的。
默认注册的内容类型
默认情况下,已经预先注册了一些常用于与Web API服务一起使用的常用MIME类型。您可以直接使用这些内容类型而无需在代码中进行任何更改,但对于任何二进制内容类型,您仍需要根据上面所述在API网关中作出相应调整。
MIME内容类型 | 响应内容编码 |
---|---|
text/plain |
默认(UTF-8) |
text/xml |
默认(UTF-8) |
application/xml |
默认(UTF-8) |
application/json |
默认(UTF-8) |
text/html |
默认(UTF-8) |
text/css |
默认(UTF-8) |
text/javascript |
默认(UTF-8) |
text/ecmascript |
默认(UTF-8) |
text/markdown |
默认(UTF-8) |
text/csv |
默认(UTF-8) |
application/octet-stream |
Base64 |
image/png |
Base64 |
image/gif |
Base64 |
image/jpeg |
Base64 |
application/zip |
Base64 |
application/pdf |
Base64 |
产品 | 版本 兼容和额外的计算目标框架版本。 |
---|---|
.NET | net6.0 兼容。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 兼容。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
-
net6.0
- Amazon.Lambda.APIGatewayEvents (>= 2.7.0)
- Amazon.Lambda.ApplicationLoadBalancerEvents (>= 2.2.0)
- Amazon.Lambda.Core (>= 2.2.0)
- Amazon.Lambda.FileSystem.AspNetCore (>= 3.1.0)
- Amazon.Lambda.Serialization.SystemTextJson (>= 2.4.1)
-
net8.0
- Amazon.Lambda.APIGatewayEvents (>= 2.7.0)
- Amazon.Lambda.ApplicationLoadBalancerEvents (>= 2.2.0)
- Amazon.Lambda.Core (>= 2.2.0)
- Amazon.Lambda.FileSystem.AspNetCore (>= 3.1.0)
- Amazon.Lambda.Serialization.SystemTextJson (>= 2.4.1)
NuGet 包 (23)
显示依赖于 Amazon.Lambda.AspNetCoreServer 的前 5 个 NuGet 包
包 | 下载 |
---|---|
Amazon.Lambda.AspNetCoreServer.Hosting 用于使用最小的 API 风格作为 AWS Lambda 函数运行 ASP.NET Core 应用程序的包。 |
|
鱼缸.Aws
用于生成 Amazon AWS CloudFormation 的 AWS CloudFormation json 模板的工具。 |
|
MhLabs.APIGatewayLambdaProxy
包描述 |
|
诺瓦.NetCore.DAL
包描述 |
|
MhLabs.APIGatewayLambdaProxy.Loggin
包描述 |
GitHub 存储库 (8)
展示依赖Amazon.Lambda.AspNetCoreServer的前5个最受欢迎的GitHub存储库
存储库 | 星数 |
---|---|
aws/aws-lambda-dotnet
用于帮助.NET Core开发者开发AWS Lambda函数的库、示例和工具。
|
|
getsentry/sentry-dotnet
Sentry SDK for .NET
|
|
exceptionless/Exceptionless.Net
.NET平台上的Exceptionless客户端
|
|
aws/aws-extensions-for-dotnet-cli
为dotnet CLI添加扩展,简化将.NET Core应用程序构建和发布到AWS服务的过程
|
|
PowerShellOrg/tug
DSC的开放源码、跨平台拉取/报告服务器
|
版本 | 下载 | 最后更新时间 |
---|---|---|
9.0.0 | 807,571 | 2/16/2024 |
8.1.1 | 590,716 | 11/14/2023 |
8.1.0 | 2,140,082 | 3/24/2023 |
8.0.0 | 470,369 | 2/13/2023 |
7.3.0 | 1,119,034 | 12/7/2022 |
7.2.0 | 2,856,746 | 5/18/2022 |
7.1.0 | 796,810 | 3/15/2022 |
7.0.1 | 912,784 | 12/13/2021 |
7.0.0 | 67,035 | 11/22/2021 |
6.1.0 | 267,747 | 11/5/2021 |
6.0.3 | 1,180,211 | 7/15/2021 |
6.0.2 | 325,321 | 5/12/2021 |
6.0.1 | 240,790 | 4/30/2021 |
6.0.0 | 272,162 | 4/5/2021 |
5.3.1 | 534,902 | 2/19/2021 |
5.3.0 | 631,290 | 1/11/2021 |
5.2.0 | 701,044 | 10/21/2020 |
5.1.6 | 268,175 | 9/30/2020 |
5.1.5 | 107,475 | 9/17/2020 |
5.1.4 | 45,196 | 9/10/2020 |
5.1.3 | 240,020 | 7/23/2020 |
5.1.2 | 177,998 | 6/25/2020 |
5.1.1 | 691,739 | 5/4/2020 |
5.1.0 | 286,846 | 4/28/2020 |
5.0.0 | 417,728 | 3/31/2020 |
4.1.0 | 325,859 | 12/18/2019 |
4.0.0 | 166,990 | 10/25/2019 |
3.1.0 | 455,468 | 6/20/2019 |
3.0.4 | 162,638 | 5/1/2019 |
3.0.3 | 128,221 | 3/8/2019 |
3.0.2 | 181,203 | 2/21/2019 |
3.0.1 | 28,771 | 2/8/2019 |
3.0.0 | 5,277 | 2/7/2019 |
2.1.0 | 495,122 | 9/25/2018 |
2.0.4 | 365,969 | 5/29/2018 |
2.0.3 | 52,714 | 5/1/2018 |
2.0.2 | 23,958 | 3/26/2018 |
2.0.1 | 50,931 | 2/12/2018 |
2.0.0 | 58,158 | 1/15/2018 |
0.10.2-preview1 | 21,964 | 6/23/2017 |
0.10.1-preview1 | 35,778 | 4/28/2017 |
0.10.0-preview1 | 1,029 | 4/26/2017 |
0.9.0-preview1 | 18,553 | 2/10/2017 |
0.8.6-preview1 | 1,789 | 1/27/2017 |
0.8.5-preview1 | 962 | 1/26/2017 |
0.8.4-preview1 | 1,317 | 1/17/2017 |
0.8.3-preview1 | 993 | 1/14/2017 |
0.8.2-preview1 | 1,130 | 12/21/2016 |
0.8.1-preview1 | 1,203 | 12/2/2016 |
0.8.0-preview1 | 6,879 | 12/1/2016 |