Windows服务上传到AWS S3

时间:2019-02-05 20:55:01

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

我正在尝试创建一个Windows服务,该服务会定期检查文件夹并将上载的所有新文件上载到S3存储桶中。

似乎代码找不到我的app.config文件,因此也没有找到AWSProfileName或任何其他值。

 private bool Upload(List<string> files,string bucketname, RegionEndpoint bucketRegion)
    {
        IAmazonS3 S3Client = new AmazonS3Client(bucketRegion);
        TransferUtility tranUtil = new TransferUtility(S3Client);
        foreach (string file in files)
        {
            tranUtil.Upload(file, bucketname, file.Replace(configFolderPath, ""));
        }
        return true;
    }

抛出这个异常

System.NullReferenceException: 'Object reference not set to an instance of an object.'

这也是我的应用配置(值已删除)

 <?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  <appSettings>
    <!--AWSProfileName is used to reference an account that has been registered with the SDK.
If using AWS Toolkit for Visual Studio then this value is the same value shown in the AWS Explorer.
It is also possible to register an account using the <solution-dir>/packages/AWSSDK-X.X.X.X/tools/account-management.ps1 PowerShell script
that is bundled with the nuget package under the tools folder.
-->
    <add key="AWSProfileName" value="******" />
    <add key="profile" value="******" />
    <add key="region" value="******" />
    <add key="configuration" value="******" />
    <add key="framework" value="netcoreapp2.1" />
  </appSettings>
</configuration>

我可以在控制台应用程序中运行完全相同的代码和app.config,它将毫无问题地上传文件。

我还尝试过破解凭据:

private bool Upload(List<string> files,string bucketname, RegionEndpoint bucketRegion)
        {
            AWSCredentials creds = new StoredProfileAWSCredentials("My AWS Profile Name");
            IAmazonS3 S3Client = new AmazonS3Client(creds, bucketRegion);
            TransferUtility tranUtil = new TransferUtility(S3Client);...

仅获得此异常:

System.ArgumentException: 'App.config does not contain credentials information. Either add the AWSAccessKey and AWSSecretKey properties or the AWSProfileName property.'

但是我确实在配置中有AWSProfileName ...

Windows服务怎么了?

找到解决方法

我正在关注这个example

正确设置用户的IAM策略后,您可以手动设置访问密钥,并使用S3客户端构造函数的重载对自己保密。显然希望从项目外部的文件中加载该文件。

        IAmazonS3 S3Client = new AmazonS3Client("IAM USER ACCESS KEY ID", "IAM USER ACCESS KEY SECRET", bucketRegion);

1 个答案:

答案 0 :(得分:2)

在发布模式下构建Windows Service时,Visual Studio会将app.config文件转换为名为yourprogram.exe.config的文件。检查此配置文件是否包含连接信息。该文件必须与exe位于同一位置。

您的配置指定了SDK商店中包含的配置文件。 SDK商店配置文件特定于特定主机中的特定用户。

当您在控制台中运行该应用程序时,您正在使用您的用户帐户运行它。该应用程序将能够在您的SDK商店中查找并找到配置文件和关联的凭据。

当您将应用程序作为服务运行时,它将使用其他用户帐户;因此它将无法在SDK商店中找到配置文件,因此将无法连接。

您可以创建一个凭证文件并进行链接,例如:

    <configuration>
      <appSettings>
        <add key="AWSProfileName" value="xxxxxx"/>
        <add key="AWSProfilesLocation" value="C:\aws_service_credentials\credentials"/>
      </appSettings>
    </configuration>

您使用文本编辑器来管理凭据文件中的配置文件。该文件应命名为凭据,并存储在您在AWSProfilesLocation中指定的位置

每个配置文件具有以下格式:

[{profile_name}]
aws_access_key_id = {accessKey}
aws_secret_access_key = {secretKey}

更多信息:
https://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/net-dg-config-creds.html