.NET6控制台调用AWSSDK.Lambda无响应,同代码在.NET Framework正常
问题描述
我用以下代码开发了.NET 6控制台应用:
var options = new AmazonLambdaConfig { RegionEndpoint = Amazon.RegionEndpoint.EUCentral1, Timeout = TimeSpan.FromMilliseconds(1000), }; var client = new Amazon.Lambda.AmazonLambdaClient("KEY", "SECRET", options); client.ExceptionEvent += Client_ExceptionEvent; client.AfterResponseEvent += Client_AfterResponseEvent; client.BeforeRequestEvent += Client_BeforeRequestEvent; string _awsResult = string.Empty; Console.WriteLine("2"); var payload = System.Text.Json.JsonSerializer.Serialize(new { client = "CLIENT",// client version = "2.0", action = "getData", serialNumber = System.Convert.ToBase64String("00-0A-40-97-0D-17".HexStringToHex()),// serial }); Console.WriteLine("3"); var response = await client.InvokeAsync(new Amazon.Lambda.Model.InvokeRequest { FunctionName = "FUNCTIONNAME-XYZ", Payload = payload, });
该代码在5台生产机器和2台开发机器上运行正常,但在某一台机器上调用InvokeAsync后无响应。将相同代码、相同NuGet包(AWSSDK.Core 3.7.204、AWSSDK.Lambda 3.7.201.49)移植到.NET Framework4.7.2项目中可正常运行,且该机器已安装.NET6桌面运行时。
更新:我创建了.NET6和.NET Framework4.7.2两个测试项目,可见.NET6版本无法正常运行;使用CLI测试调用Lambda函数则成功,现求助排查问题原因。
排查建议
- 检查异步代码阻塞问题:控制台应用中如果
Main方法不是异步的,直接使用Wait()或Result可能导致死锁。确认你的Main方法是否标记为async Task,如果是同步Main,尝试替换为异步入口:public static async Task Main(string[] args) { // 你的代码逻辑 } - 捕获并输出详细异常:当前代码订阅了
ExceptionEvent,但未展示具体实现,确保该事件处理方法中打印完整异常信息(包括堆栈跟踪):private static void Client_ExceptionEvent(object sender, ExceptionEventArgs e) { Console.WriteLine($"异常信息: {e.Exception.Message}"); Console.WriteLine($"堆栈跟踪: {e.Exception.StackTrace}"); } - 检查.NET 6运行时环境差异:
- 确认该机器安装的.NET 6运行时是最新补丁版本,部分旧版本可能存在HttpClient或AWS SDK兼容性问题。
- 对比正常机器和异常机器的.NET 6运行时版本(使用
dotnet --info命令查看)。
- 检查网络代理设置:.NET Core/.NET 6和.NET Framework的代理配置逻辑不同,即使系统代理相同,SDK可能读取方式有差异。尝试在代码中显式禁用代理:
var options = new AmazonLambdaConfig { RegionEndpoint = Amazon.RegionEndpoint.EUCentral1, Timeout = TimeSpan.FromMilliseconds(1000), ProxyHost = null, ProxyPort = -1 }; - 启用AWS SDK日志:开启详细日志排查请求过程,添加日志配置:
Amazon.AWSConfigs.LoggingConfig.LogTo = Amazon.LoggingOptions.Console; Amazon.AWSConfigs.LoggingConfig.LogLevel = Amazon.LogLevel.Debug; - 检查TLS版本兼容性:.NET 6默认使用TLS 1.3,而部分环境可能只支持TLS 1.2,尝试强制指定TLS版本:
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12; - 验证凭证加载方式:避免硬编码密钥,尝试使用AWS凭证链(环境变量、凭证文件、IAM角色)测试,确认是否是凭证加载逻辑在.NET 6下的差异。
内容的提问来源于stack exchange,提问作者David Stania
相关产品推荐
相关产品推荐

