【问题标题】:AmazonS3Client does not work in AWS Lambda S3 ProjectAmazonS3Client 在 AWS Lambda S3 项目中不起作用
【发布时间】:2025-12-27 01:45:07
【问题描述】:

我有一个简单的 C# 控制台项目,它使用 S3 Bucket 和 s3 对象。这是一个非常简单的项目,我可以找到一个对象并使用 AmazonS3Client 读取它。
我使用这个参考来工作:

  • AWSSDK.Core
  • AWSSDK.S3


例如,这个功能是我项目的一部分:

public static string GetSpecialObject(string FileName, string BucketName)
{
    AmazonS3Client client = new AmazonS3Client(Amazon.RegionEndpoint.EUWest1);
    // Create a GetObject request
    GetObjectRequest request = new GetObjectRequest
    {
        BucketName = BucketName,
        Key = FileName
    };
    using (GetObjectResponse response = client.GetObject(request))
    {
        using (StreamReader reader = new StreamReader(response.ResponseStream))
        {
            string contents = reader.ReadToEnd();
            return contents;
        }
    }
}

如您所见,它在存储桶中查找文件,我可以返回文件的值。 问题是什么 ?
我创建了一个 AWS-Lambda 项目(AWS-Lambda 函数),并尝试在那里使用 GetSpecialObject 函数。 (.Net 核心 2)
我在 AWS 上使用 AWS Toolkit 发布了我的新项目,但是当我使用 Invoke 按钮运行它时,我看到了这个错误:

"errorType": "MissingMethodException", "errorMessage": "找不到方法:'System.Collections.Generic.IList1<System.String> Amazon.Runtime.SharedInterfaces.ICoreAmazonS3.GetAllObjectKeys(System.String, System.String, System.Collections.Generic.IDictionary2)'。", “堆栈跟踪”: [ "在 App.AWSFileClass..ctor(String accessKey, String secret, String bucket)", ……” ] }

似乎我们不能将此类 (AmazonS3Client) 用于 AWS-Lambda 服务。我用谷歌搜索了很多。我发现我们可以在 Nuget 中添加一些 Amazon S3 库,名称如下:

  • Amazon.S3
  • AWSSDK.Core

但是这些库很弱。

1 - 无论如何在 AWS Lambda(.net core 2) 中使用 AmazonS3Client 类?

2 - 无论如何给我一个使用 S3Client 类来阅读 s3object 的建议?

【问题讨论】:

  • 你是怎么调用这个方法的?如果这是 Lambda 函数,那么它没有定义好(Lambda 函数必须有入口点)。
  • 这是我项目的一部分。我从 Lambda 函数主方法调用它。

标签: c# amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

.NET Core 2.0 绝对支持 AmazonS3Client。看起来您使用的是 SDK 的 .NET Framework 版本,而不是 .NET Core。我可以告诉您,因为在您的代码中,您正在调用仅在 .NET Framework 中支持的同步 GetObject 调用。对于 .NET Core,您应该只看到 GetObjectAsync

我很好奇你是如何编译它的。此代码是否包含在面向 .NET Framework 而不是 .NET Standard 的类库中?

如果您直接添加 dll,则应改为添加 NuGet 包。添加 AWSSDK.S3 NuGet 包并确保您没有对 AWSSDK.Core.dll 和 AWSSDK.S3.dll 的任何 dll 引用。通过添加 NuGet 包,它将解析为正确的平台版本

【讨论】:

  • 感谢@norm-johanson 的回复。我有一个 C# 控制台应用程序,它可以与 S3 Bucke 一起使用,并且运行良好,并且使用 .Net 框架。但之后我想在 AWS Lambda 模板上使用。所以我希望这段代码可以工作。所以我移民到那里。但似乎主要问题在于创建 AWS Client 对象。所以我使用了这个似乎与 .NetCore 兼容的 dll。 IAwsCredential awsCredential = new AwsCredential("*", "*"); s3Client = new S3Client(AwsRegion.EUWest1, awsCredential); ,为此我们没有 GetObjectResponse。你怎么看?
  • 和 @norm-johanson ,是否有任何简单的示例可以使用 AWS Lambda 进行 getobject 和 list 和 delete。我在我的简单控制台项目中做到了,但在 AWS Lambda 中,主库不起作用,这是我的问题……抱歉,描述太长了。
  • 如果您直接添加 dll,您应该添加 NuGet 包。添加 AWSSDK.S3 NuGet 包并确保您没有对 AWSSDK.Core.dll 和 AWSSDK.S3.dll 的任何 dll 引用。通过添加 NuGet 包,它将解析为正确的平台版本。
  • 非常感谢 :-)
  • 我们没有将 S3Directory API 移植到 .NET Core,因为该 API 是围绕 IAmazonS3 的同步 API 设计的。您仍然可以使用 ListObjects 操作并在请求对象上使用设置为“/”的 Delimiter 属性,然后检查响应对象上的 CommonPrefixes 属性来实现相同的目的。
最近更新 更多