You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 2.0控制台应用调用AWS Cognito SignUpAsync崩溃无异常求助

.NET Core 2.0控制台应用调用AWS Cognito SignUpAsync时无异常直接崩溃的排查与解决

咱们先从最可能的原因入手——这种在异步调用时无提示直接崩溃的情况,在.NET Core控制台应用里大多和异步代码的上下文处理有关,再结合你提到的日志没抓到AWS SDK输出的问题,一步步来排查:

1. 修复控制台Main方法的异步调用逻辑

你的Main方法是static void,如果在WaitForMenuSelection里用阻塞式的Wait()或者Result调用SignUpUser这个异步方法,很容易导致死锁或者进程直接终止(.NET Core 2.x对未处理的异步异常处理不够友好)。

解决办法:把Main改成异步入口方法(.NET Core 2.0支持async Task Main),用await来调用异步方法,避免阻塞:

static async Task Main(string[] args)
{
    // 添加全局异常捕获,后面会详细说明
    AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
    {
        log.Error("未处理的全局异常", e.ExceptionObject as Exception);
        Console.WriteLine($"未处理异常: {e.ExceptionObject}");
    };

    TaskScheduler.UnobservedTaskException += (sender, e) =>
    {
        log.Error("未被捕获的Task异常", e.Exception);
        Console.WriteLine($"未观察到的Task异常: {e.Exception}");
        e.SetObserved();
    };

    if (repo.Configured) Console.WriteLine("configured");
    AWSConfigs.AWSRegion = "us-east-1";
    AWSConfigs.LoggingConfig.LogTo = LoggingOptions.Log4Net;
    AWSConfigs.LoggingConfig.LogResponses = ResponseLoggingOption.Always;
    log.Info("Started ASSA...");
    
    ShowMenu();
    // 如果WaitForMenuSelection包含异步操作,也要改成async并await
    await WaitForMenuSelectionAsync();
}

同时确保SignUpUser被调用时用await,而非Wait()或者Result。

2. 修复AWS SDK的log4net日志配置

你说只能记录自定义log4net日志,看不到AWS SDK的输出,是因为log4net默认不会捕获Amazon.*命名空间的日志。需要在log4net.config里添加专门针对AWS日志的配置:

<log4net>
  <!-- 你的现有控制台输出配置 -->
  <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
  </appender>

  <!-- 添加AWS日志捕获器 -->
  <logger name="Amazon">
    <level value="Debug" /> <!-- 先设为Debug查看详细请求/响应 -->
    <appender-ref ref="ConsoleAppender" />
  </logger>

  <!-- 自定义日志根节点 -->
  <root>
    <level value="Info" />
    <appender-ref ref="ConsoleAppender" />
  </root>
</log4net>

这样AWS SDK的请求和响应日志就会被log4net捕获,能帮你确认SignUp请求是否正常发送,以及有没有服务端返回的错误。

3. 修复凭证加载的潜在问题

你的凭证加载代码里两次调用了awsCredentials.GetCredentials(),这可能导致重复获取凭证(如果是临时凭证的话容易出问题),改成一次获取:

try
{
    BasicAWSCredentials creds = null;
    var chain = new CredentialProfileStoreChain();
    if (chain.TryGetAWSCredentials("Thomas", out var awsCredentials))
    {
        var credsResult = awsCredentials.GetCredentials();
        creds = new BasicAWSCredentials(credsResult.AccessKey, credsResult.SecretKey);
    }
    _client = new AmazonCognitoIdentityProviderClient(creds, Amazon.RegionEndpoint.USEast1);
}
catch (Exception e)
{
    Console.WriteLine(e);
    throw;
}

另外要确认名为Thomas的凭证有调用cognito-idp:SignUp的权限,用户池客户端ID(CLIENT_ID)是否正确,且客户端允许未认证用户注册(在Cognito控制台的用户池客户端设置里,若勾选了“生成客户端密钥”,请求里需要包含密钥签名)。

4. 添加全局异常捕获

即使你在SignUpUser里加了try/catch,异步方法的异常有时候会“逃逸”到全局上下文,所以添加全局异常处理能帮你抓到那些没被捕获的异常:

// 在Main方法开头添加
AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
    log.Error("未处理的全局异常", e.ExceptionObject as Exception);
    Console.WriteLine($"未处理异常: {e.ExceptionObject}");
};

TaskScheduler.UnobservedTaskException += (sender, e) =>
{
    log.Error("未被捕获的Task异常", e.Exception);
    Console.WriteLine($"未观察到的Task异常: {e.Exception}");
    e.SetObserved(); // 标记异常已处理,避免进程直接终止
};

排查步骤建议

  1. 先修改Main为异步入口,用await调用所有异步方法,这大概率能解决无提示崩溃的问题;
  2. 调整log4net配置,查看AWS SDK的详细日志,确认请求是否正常发送到Cognito;
  3. 验证凭证权限和用户池客户端配置,确保SignUp请求符合Cognito的要求;
  4. 通过全局异常捕获查看是否有隐藏的异常。

内容的提问来源于stack exchange,提问作者Thomas Jaeger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:34:59