C# 访问部署到aws API网关的aws无服务器API时返回内部服务器错误

C# 访问部署到aws API网关的aws无服务器API时返回内部服务器错误,c#,api,asp.net-core,amazon-dynamodb,aws-serverless,C#,Api,Asp.net Core,Amazon Dynamodb,Aws Serverless,我正在尝试部署一个API来操纵AWS DynamoDB数据库。我使用了AWS.NETSDK提供的无服务器API模板。Net核心API在本地运行良好,但在将其发布到AWS Lambda后,每当我尝试访问API时,都会返回“内部服务器错误” 在CloudWatch Logs Insights中,日志消息返回如下内容 当类型的构造函数 已调用“ProjectAPI.Controllers.MyController”。有关详细信息,请检查内部异常。:LambdaException 在System.Run

我正在尝试部署一个API来操纵AWS DynamoDB数据库。我使用了AWS.NETSDK提供的无服务器API模板。Net核心API在本地运行良好,但在将其发布到AWS Lambda后,每当我尝试访问API时,都会返回“内部服务器错误”

在CloudWatch Logs Insights中,日志消息返回如下内容

当类型的构造函数 已调用“ProjectAPI.Controllers.MyController”。有关详细信息,请检查内部异常。:LambdaException

在System.RuntimeTypeHandle.CreateInstance(RuntimeType类型、Boolean publicOnly、Boolean WrapeExceptions、Boolean&canBeCached、RuntimeMethodHandleInternal&ctor)

位于System.RuntimeType.CreateInstanceSlow(布尔publicOnly、布尔WrapeExceptions、布尔skipCheckThis、布尔fillCache)

在MyController的构造函数中,我实例化了一个服务,该服务将获取凭据并设置DynamoDBContext

在MyController中:

private readonly IMyService _myService;
public CoffeeController(IMyService myService){ 
     _myService = myService;
}
在MyService中:IMyService

private readonly DynamoDBContext _context;

public CoffeeService()
{
      var chain = new CredentialProfileStoreChain();
      AWSCredentials awsCredentials;
      if (chain.TryGetAWSCredentials("Hackathon-coffee", out awsCredentials)){
            AmazonDynamoDBClient client = new AmazonDynamoDBClient(awsCredentials, RegionEndpoint.APSoutheast2);
            _context = new DynamoDBContext(client, new DynamoDBContextConfig { ConsistentRead = true, SkipVersionCheck = true });

      }else
            LambdaLogger.Log("Cannot Fetch Credentials");
}
在Startup.cs中:

public void ConfigureServices(IServiceCollection services)
{
  services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
  services.AddSingleton<IMyService, MyService>();
}
public void配置服务(IServiceCollection服务)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSingleton();
}
我假设在获取凭据时出错,但我不确定如何在.Net Core环境中正确地执行此操作。

我假设
“Hackathon coffee”
指的是存储在本地开发环境中的凭据配置文件。该配置文件在Lambda环境中不存在

在Lambda中,您很可能希望使用创建Lambda函数时分配给该函数的IAM角色的凭据

基本上,在Lambda中运行时,您希望构造
AmazonDynamoDBClient
,而无需传入
AWSCredentials
。SDK将自动解析分配角色的凭据。对于构造函数中的区域参数也是如此。如果使用空构造函数构造
AmazonDynamoDBClient
,它将使用IAM角色和函数运行所在区域的凭据配置客户端

有时,我在代码中使用的一个方便的技巧是检查
Lambda\u TASK\u ROOT
环境变量是否已设置

private只读DynamoDBContext\u上下文;
公共咖啡服务
{
if(string.IsNullOrEmpty(Environment.GetEnvironmentVariable(“LAMBDA\u TASK\u ROOT”))
{
var chain=新凭证profilestorechain();
AWSCredentials AWSCredentials;
if(连锁店TryGetAWSCredentials(“Hackathon咖啡”,out awsCredentials))
{
AmazonDynamoDBClient=新的AmazonDynamoDBClient(awsCredentials,RegionEndpoint.APSoutheast2);
_context=new DynamoDBContext(客户端,new DynamoDBContextConfig{consistentdread=true,SkipVersionCheck=true});
}
其他的
{
Log(“无法获取凭据”);
}
}
其他的
{
//使用来自IAM角色和运行函数的区域的凭据。
AmazonDynamoDBClient=新的AmazonDynamoDBClient();
_context=new DynamoDBContext(客户端,new DynamoDBContextConfig{consistentdread=true,SkipVersionCheck=true});
}
}

谢谢您的回答。我已经尝试了您的逻辑来测试无服务器应用程序。但是,它仍然返回内部服务器错误。我尝试使用LambdaLogger来查看发生了什么,但LambdaLogger似乎不适用于无服务器应用程序,因为CloudWatch日志中没有显示任何日志。我还尝试使用
sam local start api--profile myprofile
(返回内部服务器错误)在本地运行api。在终端中,我获得了以下日志:运行程序中发生未处理的异常:AWSLambda.Internal.Bootstrap.LambdaValidationException:找不到文件名为'Culture=neutral,PublicKeyToken=null'的指定处理程序程序集。程序集应位于上载的.zip文件的根目录中。错误消息为“找不到指定的处理程序程序集…”,这意味着serverless.template文件中的处理程序属性不正确。属性的值应为::。我以前手动更改了项目的名称,并且使用serverless API模板自动生成serverless.template。通常,您是否需要更改处理程序以使API正常工作?