AWS Lambda部署的.NET 6 API出现NullReferenceException问题排查
针对.NET 6 API部署AWS Lambda的NullReferenceException及404问题解决方案
1. 修正Lambda入口类的初始化逻辑(适配.NET 6架构)
.NET 6默认采用WebApplication/HostBuilder模式,旧的IWebHostBuilder写法可能导致初始化异常。修改Lambda入口类:
using System.Reflection; using System.IO; using Amazon.Lambda.AspNetCoreServer; using Microsoft.Extensions.Hosting; namespace API { public class LambdaFunction : APIGatewayProxyFunction { // 优先使用CreateHostBuilder适配.NET 6的Host模式 protected override IHostBuilder CreateHostBuilder() { return Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(webBuilder => { // 替换ContentRoot为程序集所在目录,避免Lambda环境路径问题 var contentRoot = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); webBuilder.UseContentRoot(contentRoot) .UseStartup<Startup>(); }); } } }
2. 修复ContentRoot路径问题
Lambda环境中Directory.GetCurrentDirectory()指向临时目录,而非程序集所在路径,会导致配置文件或依赖加载失败引发空引用。必须替换为程序集所在目录,代码如上。
3. 解决404与Content-Type为null问题
- 检查路由配置:确保控制器和Action上的路由属性正确,比如控制器添加
[Route("api/[controller]")],Action添加[HttpGet]/[HttpPost]等,避免路由匹配失败。 - API Gateway集成配置:确认API Gateway的资源路径、HTTP方法与API路由完全匹配,且集成类型选择Lambda代理集成(Proxy integration),否则请求无法正确转发到Lambda。
- 执行角色权限:给Lambda执行角色附加
AWSLambdaBasicExecutionRole策略,确保能写入CloudWatch日志,方便排查深层问题。
4. 增加日志排查细节
在Lambda入口类中添加日志输出,获取更详细的初始化信息:
protected override IHostBuilder CreateHostBuilder() { try { var contentRoot = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); Console.WriteLine($"ContentRoot路径: {contentRoot}"); var builder = Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseContentRoot(contentRoot) .UseStartup<Startup>(); }); Console.WriteLine("HostBuilder初始化完成"); return builder; } catch (Exception ex) { Console.WriteLine($"初始化失败详情: {ex.ToString()}"); throw; } }
通过CloudWatch日志查看这些输出,定位具体失败环节。
5. 确认部署包与运行时匹配
- 使用
dotnet lambda package命令生成部署包,确保所有依赖项被正确包含,避免手动打包遗漏文件。 - Lambda控制台选择运行时为.NET 6,且架构(x86_64/arm64)与本地编译环境一致。
内容的提问来源于stack exchange,提问作者Újfalusi Ábel
相关产品推荐
相关产品推荐

