我有一个ASP.NET Web应用程序。我的目标是异步上传文件到S3存储。我的计划是使用TransferUtility.UploadAsync
或AmazonS3Client.PutObjectAsync
。虽然文档没有明确指出异步包装器,但它们存在(here和here)。这些异步方法中的每一个都返回一个等待的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窗体)?
答案 0 :(得分:1)
我怀疑发生了什么,你调用了异步上传操作,然后原始线程退出使用块,处理上传线程试图用来上传对象的s3Client和transferUtility对象。你需要在上传线程的长度内保留这些对象。