在 Web 应用程序中使用适用于 .NET 的 AWS 开发工具包上传异步

本文关键字:开发工具 开发 AWS 工具包 异步 NET 应用程序 Web 适用于 | 更新日期: 2023-09-27 18:34:31

我有一个 ASP.NET 的Web应用程序。我的目标是异步将文件上传到 S3 存储。我的计划是使用TransferUtility.UploadAsyncAmazonS3Client.PutObjectAsync。虽然文档没有特别指出异步包装器,但它们存在(这里和这里(。这些异步方法中的每一个都返回一个可等待的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 表单以防万一(?

在 Web 应用程序中使用适用于 .NET 的 AWS 开发工具包上传异步

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