C# AWS S3 AmazonServiceException状态为SecureChannelFailure的WebException

C# AWS S3 AmazonServiceException状态为SecureChannelFailure的WebException,c#,amazon-web-services,amazon-s3,C#,Amazon Web Services,Amazon S3,具有接收请求、生成数据并将其保存在AWS S3文件中的服务。 如果服务收到多个请求,则可以尝试并行保存多达20个文件(2台服务器x 10个工作人员)。 由请求生成并保存到S3的数据可以从几KB到大约400MB 问题是,有时(似乎是在服务繁忙/需要保存大文件时)S3会失败,但以下情况除外: 我们讨论了两种解决方案: 1) 如果保存失败,请重试S3.UploadAsync()。 不确定是否会有什么不同。假设S3已经在内部重试,所以可能没有重试的必要。如果问题是文件太大/保存时间太长,这并不能解决问题

具有接收请求、生成数据并将其保存在AWS S3文件中的服务。 如果服务收到多个请求,则可以尝试并行保存多达20个文件(2台服务器x 10个工作人员)。 由请求生成并保存到S3的数据可以从几KB到大约400MB

问题是,有时(似乎是在服务繁忙/需要保存大文件时)S3会失败,但以下情况除外: 我们讨论了两种解决方案:

1) 如果保存失败,请重试S3.UploadAsync()。 不确定是否会有什么不同。假设S3已经在内部重试,所以可能没有重试的必要。如果问题是文件太大/保存时间太长,这并不能解决问题,可能会使问题变得更糟

2) 将TransferUtilityConfig.DefaultTimeout增加到10分钟(默认值为5分钟)。 如果问题是保存时间超过5分钟,这将解决问题,但S3引发的异常并不表示是超时异常,所以这可能会解决任何问题

3) 这是AWS基础设施中的间歇性问题吗?你能帮忙吗

发生此异常时,是否有人有经验/解决方案?还有其他想法吗

更新: 如果使用NET 4.5,则TransferUtilityConfig()不包含DefaultTimeout。该功能已移至AmazonS3Config。这提供了更多参数来控制上传:超时、ReadWriteTimeout、MaxErrorRetry 此处介绍了设置

这是服务用于保存的代码:

using (var amazonS3Client = new AmazonS3Client(RegionEndpoint.GetBySystemName(_iAwsS3Settings.RegionEndpoint)))
using (var fileTransferUtility = new TransferUtility(amazonS3Client))
using (var memoryStream = new MemoryStream(data))
{
    var fileTransferUtilityRequest = new TransferUtilityUploadRequest
    {
        BucketName = _iAwsS3Settings.BucketName,
        InputStream = memoryStream,
        StorageClass = S3StorageClass.ReducedRedundancy,
        PartSize = 6291456, // 6 MB.
        Key = fileLocation,
        CannedACL = S3CannedACL.BucketOwnerFullControl
    };

    await fileTransferUtility.UploadAsync(fileTransferUtilityRequest, ct);
}
这是S3保存失败时给出的异常:

System.AggregateException:发生一个或多个错误。--> Amazon.Runtime.AmazonServiceException:状态为的WebException 已引发SecureChannelFailure。-->System.Net.WebException:异常 请求被中止:无法创建SSL/TLS安全通道。在 System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult、TransportContext和context)位于 System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult 异步结果)在 System.Threading.Tasks.TaskFactory
1.FromAsyncCoreLogic(IAsyncResult
iar,Func
2结束函数,动作1结束动作,任务1承诺,布尔值 requiresSynchronization)---来自上一个堆栈的堆栈结束跟踪 引发异常的位置---at System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Amazon.Runtime.Internal.HttpHandler
1.d_u9
1.MoveNext() ---来自引发异常的上一个位置的堆栈结束跟踪---在 Amazon.Runtime.Internal.HttpHandler
1.d_u9
1.MoveNext() ---来自引发异常的上一个位置的堆栈结束跟踪---在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Amazon.Runtime.Internal.RedirectHandler.d_u1
1.MoveNext()
---来自引发异常的上一个位置的堆栈结束跟踪---在
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
Amazon.Runtime.Internal.Unmarshaller.d_u3
1.MoveNext() ---来自引发异常的上一个位置的堆栈结束跟踪---在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Amazon.S3.Internal.AmazonS3ResponseHandler.d_u1
1.MoveNext()
---来自引发异常的上一个位置的堆栈结束跟踪---在
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
Amazon.Runtime.Internal.ErrorHandler.d_u5
1.MoveNext() ---内部异常堆栈跟踪的结束---在Amazon.Runtime.Internal.WebExceptionHandler.HandleException(IExecutionContext)中 executionContext,WebException异常)位于 Amazon.Runtime.Internal.ErrorHandler.ProcessException(IExecutionContext executionContext,异常)位于 Amazon.Runtime.Internal.ErrorHandler.d_u5
1.MoveNext()
---来自引发异常的上一个位置的堆栈结束跟踪---在
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
Amazon.Runtime.Internal.CallbackHandler.d_u9
1.MoveNext() ---来自引发异常的上一个位置的堆栈结束跟踪---在 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Amazon.Runtime.Internal.CredentialsRetriever.d_u7
1.MoveNext()
---来自引发异常的上一个位置的堆栈结束跟踪---在
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
Amazon.Runtime.Internal.RetryHandler.d_u10
1.MoveNext() ---来自引发异常的上一个位置的堆栈结束跟踪---在 Amazon.Runtime.Internal.RetryHandler.d_u10`1.MoveNext()


S3SDK已经实现了

默认情况下,上载是

创建了一个控制台应用程序以尝试重现错误。控制台应用程序尝试异步上载10-30个文件。更改AmazonS3Config中超时、ReadWriteTimeout、MaxErrorRetry产生的异常(System.Net.WebException:操作已超时)的值,但与我们的值不同(无法创建SSL/TLS se)
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
ServicePointManager.CheckCertificateRevocationList = true;