使用来自IIS .Net的AWS S3 API时,对象引用未设置为对象的实例

时间:2019-06-18 16:51:04

标签: c# .net amazon-web-services amazon-s3

我正在尝试将文件保存到S3存储桶。我将文件复制到临时位置,只是(对我而言)证明文件存在并且可以访问。当然,该副本可以正常工作。

最后一行不断抛出异常,详细信息为“对象引用未设置为对象的实例”。

File.Copy(fullFilePath, "C:\\Temp\\" + fullFileName);

IAmazonS3 client = null;
if (Session["s3Client"] != null) {
    client = (IAmazonS3)Session["s3Client"];
} else {
    client = new AmazonS3Client(RegionEndpoint.GetBySystemName(AWS_REGION));
} // if

PutObjectRequest putRequest = new PutObjectRequest {
    BucketName = S3_BUCKET_NAME,
    Key = fullFileName
};

using (FileStream stream = new FileStream(fullFilePath, FileMode.Open)) {
    putRequest.InputStream = stream;

    // Put object
    PutObjectResponse response = client.PutObject(putRequest);
}

我已经通过S3呼叫尝试了一些方法:

  1. 不同的键(尝试单词“ blah”)
  2. 不同的存储桶
  3. 发送 文件而不是流

由于我实际上仅提供3个字段,因此我没有太多尝试的机会。

我正在尝试将身份验证放在代码之外,以便主机可以控制它。

有什么想法吗?

非常感谢。

编辑:

at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.FetchCredentials()
at Amazon.Runtime.DefaultInstanceProfileAWSCredentials.GetCredentials()
at Amazon.Runtime.Internal.CredentialsRetriever.PreInvoke(IExecutionContext executionContext)
at Amazon.Runtime.Internal.CredentialsRetriever.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.RetryHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.CallbackHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.CallbackHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.S3.Internal.AmazonS3ExceptionHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.ErrorCallbackHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.MetricsHandler.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.Internal.RuntimePipeline.InvokeSync(IExecutionContext executionContext)
at Amazon.Runtime.AmazonServiceClient.Invoke[TResponse](AmazonWebServiceRequest request, InvokeOptionsBase options)
at MyCode.aspx.cs:line 260

1 个答案:

答案 0 :(得分:1)

这个问题都与IIS权限有关。 AWS试图通过web.config文件中的条目访问凭据:

<configSections>
  <section name="aws" type="Amazon.AWSSection, AWSSDK.Core"/>
</configSections>
<aws profileName="default" profilesLocation="C:\Users\Administrator\.aws\credentials"/>

IIS运行时,它无权访问上面列出的凭据文件。

解决方案是为defaultAppPool授予对该文件的读取权限。我是通过在目录的“安全性”选项卡中添加“ IIS APPPOOL \ defaultAppPool”来确保其具有读取权限的。

enter image description here

AWS的错误非常严重。正确的错误消息,我可以节省很多时间。