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                
此命令旨在在 Visual Studio 的包管理器控制台中使用,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="Amazon.Lambda.AspNetCoreServer" Version="9.0.0" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中,以引用此包。
paket add Amazon.Lambda.AspNetCoreServer --version 9.0.0                
#r "nuget: Amazon.Lambda.AspNetCoreServer, 9.0.0"                
#r 指令可以在 F# Interactive 和 Polyglot Notebooks 中使用。将此复制到交互式工具或脚本的源代码中,以引用此包。
// 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 时,不会调用 CreateHostBuilderInit(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 已计算。
兼容的目标框架
包含的目标框架(在包中)
了解有关 目标框架.NET 标准文档 的更多信息。

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