.NET 6 REST API部署至AWS Lambda遇程序集加载失败问题求助
我之前处理过不少.NET 6迁移到AWS Lambda的案例,你遇到的LambdaValidationException: Unable to load assembly问题,核心原因是.NET 6的Program.cs采用了顶级语句的极简模式,和传统ASP.NET的Startup类结构完全不同——直接在LambdaEntryPoint里用builder.UseStartup<Program>()根本没法正确识别和加载程序集,因为Program类不再是那种包含ConfigureServices/Configure方法的传统启动类了。
接下来给你一步步解决的方案:
1. 重构LambdaEntryPoint的配置逻辑
放弃UseStartup<Program>这种旧方式,直接在LambdaEntryPoint里复用你Program.cs中的WebApplication构建逻辑,代码示例如下:
using Amazon.Lambda.AspNetCoreServer; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Hosting; namespace MyAssembly; public class LambdaEntryPoint : APIGatewayProxyFunction { protected override void Init(IWebHostBuilder builder) { // 用.NET 6的WebApplicationBuilder来构建,把Lambda的WebHostBuilder传进去 var webAppBuilder = WebApplication.CreateBuilder(new WebApplicationOptions { WebHostBuilder = builder }); // 这里复制你Program.cs里的服务配置,比如你原来的AddControllers webAppBuilder.Services.AddControllers(); var app = webAppBuilder.Build(); // 再复制你Program.cs里的中间件配置,保持和本地运行一致 app.UseRouting(); app.UseAuthorization(); app.MapControllers(); // 不用调用app.Run(),Lambda会自己接管请求处理 } }
2. 确认依赖包版本适配.NET 6
一定要确保你用的Amazon.Lambda.AspNetCoreServer NuGet包是6.x及以上版本,老版本不支持.NET 6的新结构。可以用命令行更新:
dotnet add package Amazon.Lambda.AspNetCoreServer --version 6.0.0
3. 用官方命令打包,避免手动出错
别自己手动压缩文件,用AWS Lambda的官方打包命令生成部署包,这样能保证所有依赖都被正确包含:
dotnet lambda package --configuration Release --framework net6.0 --output-package bin/Release/net6.0/lambda-package.zip
4. 检查Program类的partial声明
你加的public partial class Program { }是对的(方便单元测试访问),但要注意这个类的命名空间必须和LambdaEntryPoint一致,而且你在AWS控制台填的程序集路径MyAssembly::MyAssembly.LambdaEntryPoint::FunctionHandlerAsync必须完全匹配实际的程序集名称和类名。
5. 调整测试事件(可选但推荐)
你的测试事件里isBase64Encoded设为true,但你的接口返回的是JSON文本,建议改成false,不然后续可能会出现返回结果解析异常:
{ "resource": "/Home", "path": "/Home", "httpMethod": "GET", "isBase64Encoded": false }
最后,重新打包部署到Lambda,再用调整后的测试事件试试。如果还是有问题,解压部署包看看有没有遗漏必要的.dll文件,或者检查Lambda执行角色的权限是否足够读取程序集。
内容的提问来源于stack exchange,提问作者TortillaCurtain

