C# AWS S3 AmazonServiceException状态为SecureChannelFailure的WebException
具有接收请求、生成数据并将其保存在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 此处介绍了设置 这是服务用于保存的代码: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已经在内部重试,所以可能没有重试的必要。如果问题是文件太大/保存时间太长,这并不能解决问题
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.TaskFactory1.FromAsyncCoreLogic(IAsyncResult
iar,Func
2结束函数,动作1结束动作,任务1承诺,布尔值
requiresSynchronization)---来自上一个堆栈的堆栈结束跟踪
引发异常的位置---at
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
Amazon.Runtime.Internal.HttpHandler1.d_u9
1.MoveNext()
---来自引发异常的上一个位置的堆栈结束跟踪---在
Amazon.Runtime.Internal.HttpHandler1.d_u9
1.MoveNext()
---来自引发异常的上一个位置的堆栈结束跟踪---在
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务
任务)在
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务
任务)在
Amazon.Runtime.Internal.RedirectHandler.d_u11.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_u11.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_u51.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_u71.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;