【问题标题】:Parallel Blob Upload throwing 404 Bad Request intermittently并行 Blob 上传间歇性抛出 404 错误请求
【发布时间】:2014-08-05 10:16:17
【问题描述】:

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

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();
    }
}

这个方法被调用,

    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);
    }

我的信息流是HttpPostedFileBase.InputStream。有时它有效,有时我得到The remote server returned an error: (400) Bad Request.。如果我设置一个断点,它也可以工作。

【问题讨论】:

  • 400 绝对是服务器错误,表示客户端发送了错误的请求。尝试使用 Fiddler 查看好请求和坏请求之间的区别。
  • @PauloMorgado,如果我 await UploadFromStreamAsync 那么它会工作
  • 等待UploadFromStreamAsync 应该没有任何效果。你用 Fiddler 检查过 HTTP 内容吗?
  • 信息不足。错误请求何时发生?某些时候?随机?在特定时间后?你发现异常了吗?如果是这样,您会看到任何内部消息。您是否通过提琴手查看过,所以您的请求始终有效?您的服务器可以同时进行多次上传吗?
  • @user960567 你能显示调用SaveAllAsync的方法吗?

标签: asp.net-mvc azure async-await azure-blob-storage c#-5.0


【解决方案1】:

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

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

  • 起初,RequestInformation 说了一些关于错误代码为“Md5Mismatch”的 MD5 问题,但我的直觉说不是这样,因为单线程就像一个魅力,然后..我找到了它...@ 987654326@ CloudBlobClient 对象和问题已解决。

  • BlobRequestOptions Members 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;
    }

【讨论】:

    【解决方案2】:

    您所描述的行为听起来很像线程问题(即,如果您对代码进行断点,它可以正常工作,因为它当时实际上是单线程的)导致发送到 Azure 存储 API 的数据不完整或无效。

    您的“var image”定义在多线程环境中可能会出现意外行为(如果您使用 ReSharper,它将突出显示该变量并建议更改代码,因为它可能不安全)。

    阅读这篇 SO 帖子以了解更多信息以及如何更好地实现代码。

    The foreach identifier and closures

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多