我正在使用官方Amazon的最新版本(1.0.14.1)来创建备份工具。到目前为止,如果我要上传的文件的大小小于5MB,那么所有内容都能正常工作,但是当任何文件都超过5MB时,上传就会失败,只有以下例外:
System.Net.WebException:请求被中止:请求被取消。-> System.IO.IOException:在写入所有字节之前不能关闭流。在System.Net.ConnectStream.CloseInternal(Boolean internalCall,布尔中止)-内部异常堆栈跟踪的结束-在Amazon.S3.AmazonS3Client.ProcessRequestError(String actionName、HttpWebRequest请求、WebException we、HttpWebResponse errorResponse、String requestAddr、WebHeaderCollection& respHdrs、Type t( Amazon.S3.AmazonS3Client.InvokeT at Amazon.S3.AmazonS3Client.PutObject(PutObjectRequest request) at BackupToolkit.S3Module.UploadFile(String sourceFileName )时W:\code\AutoBackupTool\BackupToolkit\S3Module.cs:line 88 at BackupToolkit.S3Module.UploadFiles(String sourceDirectory)中W:\code\AutoBackupTool\BackupToolkit\S3Module.cs:line 108中的字符串destinationFileName)
注意事项:5MB大致是故障的边界,它可以稍微低一点,也可以更高一些。
我假设连接正在超时,并且在文件上传完成之前流被自动关闭。
我试图找到一种设置长超时的方法(但我在AmazonS3
或AmazonS3Config
中都找不到这个选项)。
对于如何增加超时(比如我可以使用的应用程序范围的设置)有什么想法吗?或者它与超时问题无关吗?
代码:
var s3Client = AWSClientFactory.CreateAmazonS3Client(AwsAccessKey, AwsSecretKey);
var putObjectRequest = new PutObjectRequest {
BucketName = Bucket,
FilePath = sourceFileName,
Key = destinationFileName,
MD5Digest = md5Base64,
GenerateMD5Digest = true
};
using (var upload = s3Client.PutObject(putObjectRequest)) { }
发布于 2010-10-06 10:24:52
最新答案:
我最近更新了一个使用Amazon .NET SDK (到1.4.1.0版本)的项目,在这个版本中,当我在这里编写原始答案时,有两个改进不存在。
现在,您可以将operation.
-1
,使其具有无限的时间限制。put 现在是PutObjectRequest
上的一个额外属性,称为ReadWriteTimeout
,可以设置(毫秒)在流读/写入级别上的超时,而不是整个put操作级别。所以我的代码现在看起来如下:
var putObjectRequest = new PutObjectRequest {
BucketName = Bucket,
FilePath = sourceFileName,
Key = destinationFileName,
MD5Digest = md5Base64,
GenerateMD5Digest = true,
Timeout = -1,
ReadWriteTimeout = 300000 // 5 minutes in milliseconds
};
原始答案:
我设法找到了答案..。
在发布这个问题之前,我已经研究过AmazonS3
和AmazonS3Config
,但没有探讨PutObjectRequest
。
在PutObjectRequest
内部有一个Timeout
属性(以毫秒为单位)。我已经成功地使用它来上传更大的文件(注意:将其设置为0并不会删除超时,您需要指定一个正数毫秒.我已经走了一个小时了。
这样做很好:
var putObjectRequest = new PutObjectRequest {
BucketName = Bucket,
FilePath = sourceFileName,
Key = destinationFileName,
MD5Digest = md5Base64,
GenerateMD5Digest = true,
Timeout = 3600000
};
发布于 2012-04-02 06:58:53
我一直有类似的问题,并开始使用TransferUtility类来执行多部分上传。
目前,这段代码正在工作。但是,当超时设置得太低时,我确实遇到了问题!
var request = new TransferUtilityUploadRequest()
.WithBucketName(BucketName)
.WithFilePath(sourceFile.FullName)
.WithKey(key)
.WithTimeout(100 * 60 * 60 * 1000)
.WithPartSize(10 * 1024 * 1024)
.WithSubscriber((src, e) =>
{
Console.CursorLeft = 0;
Console.Write("{0}: {1} of {2} ", sourceFile.Name, e.TransferredBytes, e.TotalBytes);
});
utility.Upload(request);
当我输入这个,我有一个4GB的上传发生,它已经通过了比以往任何时候!
发布于 2015-07-13 10:44:58
AWSSDKfor.NET有两个主要的API与Amazon 3一起工作。
1.低级API :
AmazonS3Client是一个名为
的客户端对象,它为S3公开的每个服务操作实现IAmazonS3 interface.It包含方法。
命名空间:Amazon.S3,Amazons.3.模型
// Step 1 :
AmazonS3Config s3Config = new AmazonS3Config();
s3Config.RegionEndpoint = GetRegionEndPoint();
// Step 2 :
using(var client = new AmazonS3Client(My_AWSAccessKey, My_AWSSecretKey, s3Config) )
{
// Step 3 :
PutObjectRequest request = new PutObjectRequest();
request.Key = My_key;
request.InputStream = My_fileStream;
request.BucketName = My_BucketName;
// Step 4 : Finally place object to S3
client.PutObject(request);
}
2. TransferUtility : (我建议使用此API)
TransferUtility运行在底层API之上.对于将对象放入S3并将其放入S3中,它是一个简单的接口,用于处理S3最常见的用途。最大的好处在于放置物体。例如,TransferUtility检测文件是否很大,并切换到多部分上载模式。
命名空间:Amazon.S3.Transfer
// Step 1 : Create "Transfer Utility" (replacement of old "Transfer Manager")
TransferUtility fileTransferUtility =
new TransferUtility(new AmazonS3Client(Amazon.RegionEndpoint.USEast1));
// Step 2 : Create Request object
TransferUtilityUploadRequest uploadRequest =
new TransferUtilityUploadRequest
{
BucketName = My_BucketName,
FilePath = My_filePath,
Key = My_keyName
};
// Step 3 : Event Handler that will be automatically called on each transferred byte
uploadRequest.UploadProgressEvent +=
new EventHandler<UploadProgressArgs>
(uploadRequest_UploadPartProgressEvent);
static void uploadRequest_UploadPartProgressEvent(object sender, UploadProgressArgs e)
{
Console.WriteLine("{0}/{1}", e.TransferredBytes, e.TotalBytes);
}
// Step 4 : Hit upload and send data to S3
fileTransferUtility.Upload(uploadRequest);
https://stackoverflow.com/questions/3871430
复制相似问题