在Web应用程序中使用AWS SDK for .NET上载异步

时间:2016-02-14 19:57:22

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

我有一个ASP.NET Web应用程序。我的目标是异步上传文件到S3存储。我的计划是使用TransferUtility.UploadAsyncAmazonS3Client.PutObjectAsync。虽然文档没有明确指出异步包装器,但它们存在(herehere)。这些异步方法中的每一个都返回一个等待的Task。我的问题是这两种方法都不适合我(文件根本没有显示在桶中)。我的代码调用异步方法,不会等待任务完成。虽然我知道这个设计的后果(就像IIS可能因为没有附加请求而关闭我的任务这一事实),但我对此很好。代码如下所示:

public static void AddFileAsync(Stream stream, string key)
{
    using (IAmazonS3 s3Client = AmazonS3ConfigManager.GetAmazonS3Client()) // here I provide the private and public keys and the region endpoint
    using (TransferUtility transferUtility = new TransferUtility(s3Client))
    {
        TransferUtilityUploadRequest fileTransferUtilityRequest = new TransferUtilityUploadRequest
        {
            BucketName = "MyBucketName",
            InputStream = stream,
            Key = key,
            AutoCloseStream = false // because I need the stream for later
        };
        transferUtility.UploadAsync(fileTransferUtilityRequest);
    }
}

另一方面,如果我等待以完成返回的任务,则文件会成功上传。在代码中,如果我执行以下操作,它可以工作:

var task = transferUtility.UploadAsync(fileTransferUtilityRequest);
task.Wait();

有没有办法在ASP.NET Web应用程序中执行异步上传到Amazon S3(如果重要的话,我使用Web窗体)?

1 个答案:

答案 0 :(得分:1)

我怀疑发生了什么,你调用了异步上传操作,然后原始线程退出使用块,处理上传线程试图用来上传对象的s3Client和transferUtility对象。你需要在上传线程的长度内保留这些对象。