Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 并行Blob上载间歇性抛出404错误请求_Asp.net Mvc_Azure_Async Await_Azure Storage Blobs_C# 5.0 - Fatal编程技术网

Asp.net mvc 并行Blob上载间歇性抛出404错误请求

Asp.net mvc 并行Blob上载间歇性抛出404错误请求,asp.net-mvc,azure,async-await,azure-storage-blobs,c#-5.0,Asp.net Mvc,Azure,Async Await,Azure Storage Blobs,C# 5.0,我有一个非常简单的服务 public class AzureService : IAzureService { private readonly CloudBlobContainer _container; public AzureService(ISettings settings) { var storageAccount = CloudStorageAccount.Parse(settings.BlobConnectionString);

我有一个非常简单的服务

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);
    }
public任务SaveAllAsync(字典图像)
{
var tasks=新列表();
foreach(图像中的var图像)
{
var fileName=image.Key;
var stream=image.Value;
var task=_azureService.UploadBlobAsync(文件名,流);
任务。添加(任务);
}
返回任务。WhenAll(任务);
}

我的溪流是。有时它可以工作,有时我收到
远程服务器返回错误:(400)错误请求。
。如果我设置一个断点,它也可以工作。

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

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

阅读这篇文章,了解更多,以及如何更好地实现代码


我也遇到了同样的问题,我尝试使用
等待任务在一次打击、单线程工作、多线程中上载20多个图像。当所有
失败时,“远程服务器返回错误:(400)错误请求。”

  • 有关详细信息,请参阅上载[xxx]异步方法引发的Microsoft.WindowsAzure.Storage.StorageException内的
    RequestInformation

  • 起初,
    RequestInformation
    提到了一个错误代码为“Md5Mismatch”的MD5问题,但我的直觉告诉我不是这样,因为单线程就像一个符咒,然后。。我找到了
    DefaultRequestOptions。已解决
    CloudBlobClient
    对象和问题上的并行操作ThreadCount


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

400肯定是服务器错误,表示客户端发送了错误的请求。尝试使用Fiddler查看好请求和坏请求之间有什么不同。@PauloMorgado,如果我
等待从StreamAsync上传
,那么等待
从StreamAsync上传
应该不会有任何效果。你用Fiddler检查过HTTP内容吗?没有足够的信息。错误请求何时发生?某些时候?随机?在一段特定的时间之后?你发现了一个例外吗?如果是这样,你会看到任何内在的信息。您是否已通过fiddler查看以确保您的请求始终有效?您的服务器可以一次进行多个上载吗?@user960567您可以显示调用
SaveAllAsync
的方法吗?