首页 > 解决方案 > AWSSDK.S3 C# Dll 错误在 PowerShell 控制台中但不在 ISE 中(我们计算的请求签名与您提供的签名不匹配。)

问题描述

我正在尝试从 AWS S3 存储中检索密钥。我的主要目标是拥有一个 dll,我可以从基于 delphi 的系统中将其作为 com 对象执行。

这对于“普通”键非常有效,但是我们有一个保存为“documents/00012000/12368”的键。

(是的,最后有一个句点是 S3 的特殊字符,但是根据 AWS 文档,这应该通过 SDK 工作)。

当我尝试读取对象时,当我通过 PowerShell 控制台运行此 dll 时收到错误“我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法”,但是如果我通过运行相同的代码它成功执行并检索文件的 PowerShell ISE

dll中的方法是:

public byte[] getFile(string Bucket, string Key)
        {
            var credentials = new Amazon.Runtime.BasicAWSCredentials("my key", "my secret");
            
            // Create a client
            AmazonS3Client client = new AmazonS3Client(credentials, RegionEndpoint.APSoutheast2);
            
            // Create a GetObject request
            GetObjectRequest request = new GetObjectRequest
            {
                BucketName = Bucket,
                Key = Key
            };
            MemoryStream outputstream = new MemoryStream();
            // Issue request and remember to dispose of the response
            using (GetObjectResponse response = client.GetObject(request))
            {
                // Save object to local file
                //response.WriteResponseStreamToFile(@"C:\temp\Test.pdf");
                response.ResponseStream.CopyTo(outputstream);
                return outputstream.ToArray();
            }

        }

如果我尝试检查文件是否存在,我也会收到一个错误(“错误发出请求,错误代码禁止和 Http 状态代码禁止。服务没有返回进一步的错误信息。),再一次,通过 ISE 它可以工作.

public bool fileExists(string Bucket, string Key)
        {
            // Create a client
            var credentials = new Amazon.Runtime.BasicAWSCredentials("my key", "my secret");
            
            // Create a client
            AmazonS3Client client = new AmazonS3Client(credentials, RegionEndpoint.APSoutheast2);

            S3FileInfo file = new S3FileInfo(client, Bucket, Key);
            return file.Exists;
            
        }

作为旁注,我还创建了一个测试 .net 框架表单应用程序来调用 .net dll 进行测试,它可以工作。

我不知道为什么相同的代码在 ISE 中的行为不同,从 .net 形式的 exe 到 PowerShell 控制台以及从 delphi 调用的 com 对象。

有没有人见过这种行为?

我尝试在从 4.5.2 到 4.7.2 的多个框架中编译 dll,没有任何变化。我还尝试使用带有以下代码的 PowerShell 模块并收到相同的错误:

$Bucket="mybucket"
$s3file="documents/00012000/12368."
Read-S3Object -BucketName $Bucket -accesskey mykey -secretkey mysecret -region ap
-southeast-2 -Key $s3file -File "d:\temp\file.pdf"

我知道避免在结尾处命名一个带有句点的键是理想的,但是我目前无法控制它。

AWSSDK.Core 版本 3.7.1.1(最新稳定版) AWSSDK.S3 版本 3.7.1.17(最新稳定版)

PowerShell 版本 5.1.19041.1023

标签: c#amazon-web-servicespowershellamazon-s3

解决方案


推荐阅读