并行Blob上传间歇性地抛出404错误请求

use*_*567 7 asp.net-mvc azure azure-storage-blobs async-await c#-5.0

我有一个非常简单的服务,

public class AzureService : IAzureService
{
    private readonly CloudBlobContainer _container;
    public AzureService(ISettings settings)
    {
        var storageAccount = CloudStorageAccount.Parse(settings.BlobConnectionString);            
        var blobClient = storageAccount.CreateCloudBlobClient();
        _container = blobClient.GetContainerReference(settings.BlobContainerName);
    }

    public Task UploadBlobAsync(string fileName, Stream stream)
    {
        var blob = _container.GetBlockBlobReference(fileName);
        return blob.UploadFromStreamAsync(stream);
    }

    public Task DeleteBlobAsync(string fileName)
    {
        var blob = _container.GetBlockBlobReference(fileName);
        return blob.DeleteAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

这个方法叫做,

    public Task SaveAllAsync(Dictionary<string, Stream> images)
    {
        var tasks = new List<Task>();
        foreach (var image in images)
        {
            var fileName = image.Key;
            var stream = image.Value;
            var task = _azureService.UploadBlobAsync(fileName, stream);
            tasks.Add(task);
        }
        return Task.WhenAll(tasks);
    }
Run Code Online (Sandbox Code Playgroud)

我的流是HttpPostedFileBase.InputStream.有时它有效,有时我得到The remote server returned an error: (400) Bad Request..如果我提出一个断点也可以.

Zak*_*kos 3

我遇到了同样的问题,我尝试在 1 次罢工中上传 20 多个图像,单线程工作,多线程使用await Task.WhenAll失败,并显示“远程服务器返回错误:(400) 错误请求”。

  • 有关更多详细信息,请参阅Upload[xxx]Async 方法抛出的 RequestInformation内部内容。Microsoft.WindowsAzure.Storage.StorageException

  • 首先,RequestInformation说了一些关于错误代码为“Md5Mismatch”的 MD5 问题,相信我的直觉说不然,因为单线程工作起来就像一个魅力,然后..我发现了它......DefaultRequestOptions.ParallelOperationThreadCountCloudBlobClient对象和问题解决上。

  • BlobRequestOptions 成员 MSDN


    private CloudBlobContainer ConnectToImageContainer()
    {
        var credentials = new StorageCredentials(AccountName, ImagesContainerKey);
        var account = new CloudStorageAccount(credentials, useHttps: true);
        var client = account.CreateCloudBlobClient();
        client.DefaultRequestOptions.ParallelOperationThreadCount = 64; // max value
        client.DefaultRequestOptions.SingleBlobUploadThresholdInBytes = 67108864; // max value
        var container = client.GetContainerReference(ImagesContainerName);
        return container;
    }
Run Code Online (Sandbox Code Playgroud)