c# - 从 c# 将文件上传到 Azure 文件时如何更改最大并发值?
问题描述
我正在尝试将文件(~250Mb 大小)上传到 Azure 文件共享(不是 blob 存储),并且在多次重试尝试后上传失败并抛出异常,指出请求在 6 次重试后失败。我在将文件上传到 azure blob 存储时遇到了完全相同的问题,我发现我需要减少 BlobUploadOptions 上的并发线程数,因为我的网络速度无法处理大量并行线程进行上传。现在要上传到 Azure 文件共享,我找不到可以设置上传最大并发数的属性。关于如何设置它的任何想法?或者任何替代解决方案?PS我正在使用.NET Azure SDK v12
我正在使用的代码:
string shareName = "test-share";
string dirName = "sample-dir";
string fileName = Path.GetFileName(localFilePath);
ShareClient share = new ShareClient(ConnectionString, shareName);
await share.CreateAsync();
ShareDirectoryClient directory = share.GetDirectoryClient(dirName);
await directory.CreateAsync();
ShareFileClient fileClient = directory.GetFileClient(fileName);
using (FileStream stream = File.OpenRead(localFilePath))
{
await fileClient.CreateAsync(stream.Length);
await fileClient.UploadRangeAsync(
new HttpRange(0, stream.Length),
stream);
}
我在上传到 blob 存储时解决了这个问题,如下所示:
BlobUploadOptions uploadOptions = new BlobUploadOptions() {
TransferOptions = new Azure.Storage.StorageTransferOptions() {
MaximumConcurrency = 2,
InitialTransferSize = 100 * 1024 * 1024
}
};
using (FileStream uploadFileStream = File.OpenRead(filePath))
{
await blobClient.UploadAsync(uploadFileStream, uploadOptions);
uploadFileStream.Close();
}
解决方案
浏览 .NET Azure SDK v12 的源码后,.NET Azure SDK v12 没有这样的设置file share
。
作为一种解决方法,您可以先将文件分块,然后将这些分块文件一个一个上传。在这种情况下,没有并发。示例代码如下:
//other code
ShareFileClient fileClient = directory.GetFileClient(fileName);
using (FileStream stream = File.OpenRead(localFilePath))
{
await fileClient.CreateAsync(stream.Length);
int blockSize = 1 * 1024 * 1024;
long offset = 0;//Define http range offset
BinaryReader reader = new BinaryReader(stream);
while (true)
{
byte[] buffer = reader.ReadBytes(blockSize);
if (buffer.Length == 0)
break;
MemoryStream uploadChunk = new MemoryStream();
uploadChunk.Write(buffer, 0, buffer.Length);
uploadChunk.Position = 0;
HttpRange httpRange = new HttpRange(offset, buffer.Length);
var resp = await fileClient.UploadRangeAsync(httpRange, uploadChunk);
offset += buffer.Length;//Shift the offset by number of bytes already written
}
reader.Close();
}
顺便说一句,有一个Azure Storage Data Movement Library,如果你选择用它来上传文件,你就有机会控制并发。
推荐阅读
- python - 从 YAML 读取后 Python openCV 断言失败
- php - 使用 volley 库从数据库中选择的用户名制作 numberpicker
- camunda - 如何基于 DMN 规则执行 Camunda BPMN 工作流
- jsf - IllegalArgumentException:JSF 中的 sortBy 列内的排序函数
- networking - HTTP / SOCKS5 转发
- python - 如何根据python中的字典更新excel列值
- php - 如何保存 HTML 内容?
- createjs - createjs 示例中 circle.x 和 circle.y 的目的是什么?
- python-3.x - 如何在 Binance 中获取硬币名称
- material-ui - 将图标放在圆圈内