Azure Worker角色和blob存储Microsoft.WindowsAzure.Storage.StorageE

本文关键字:Microsoft WindowsAzure Storage StorageE 存储 blob Worker 角色 Azure | 更新日期: 2023-09-27 18:12:31

我在blob存储中上传了文件。我正试图从工人角色下载这些文件,对其进行一些处理。容器名称从WebApi2发送到队列。

worker角色首先从队列中获取容器名称,然后尝试下载该容器中的blob。

下面是名称的代码:

  public override void Run()
    {
        Trace.WriteLine("Starting processing of messages");
        // Initiates the message pump and callback is invoked for each message that is received, calling close on the client will stop the pump.
        Client.OnMessage((receivedMessage) =>
        {
            try
            {
                // Process the message
                Trace.WriteLine("Processing Service Bus message: " + receivedMessage.SequenceNumber.ToString());
                string msg = "Container Name: " + receivedMessage.GetBody<String>();
                Trace.WriteLine("Processing Service Bus message: " + msg);
                CloudStorageAccount storageAccount =   CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("MyStorage"));

                CloudBlobContainer imagesContainer = null;

                CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
                imagesContainer = blobClient.GetContainerReference(msg);

                // Create the container if it doesn't already exist.
                imagesContainer.CreateIfNotExists();

                imagesContainer.SetPermissions(new BlobContainerPermissions
                {
                    PublicAccess = BlobContainerPublicAccessType.Blob
                });
                var blobs = imagesContainer.ListBlobs();
                var listOfFileNames = new List<string>();

                foreach (var blob in blobs)
                {
                    var blobFileName = blob.Uri.Segments.Last();
                    listOfFileNames.Add(blobFileName);
                    Trace.WriteLine(listOfFileNames);
                }
                if (listOfFileNames == null)
                {
                    Trace.WriteLine("present");
                }

                for (i = 1; i < 3; i++)
                {
                    CloudBlockBlob signBlob =    imagesContainer.GetBlockBlobReference(i + ".txt");
                    MemoryStream lms = new MemoryStream();
                    signBlob.DownloadToStream(lms);
                    lms.Seek(0, SeekOrigin.Begin);
                    StreamReader SR = new StreamReader(lms);
                    Trace.WriteLine(SR);
                }

            }


            catch(Microsoft.WindowsAzure.Storage.StorageException e)
            {
                // Handle any message processing specific exceptions here
                Trace.WriteLine("Error:" + e);
            }
        });
        CompletedEvent.WaitOne();
    }

我得到了下面的Exception:

enter code hereException thrown: 'Microsoft.WindowsAzure.Storage.StorageException' in Microsoft.WindowsAzure.Storage.dll

错误:Microsoft.WindowsAzure.Storage。StorageException:远程服务器返回了一个错误:(400)Bad Request。--> system.net.webeexception:远程服务器返回一个错误:(400)Bad Request。在System.Net.HttpWebRequest.GetResponse ()在Microsoft.WindowsAzure.Storage.Core.Executor.Executor。ExecuteSync[T](RESTCommand 1 cmd, IRetryPolicy policy, OperationContext operationContext) in c:'Program Files (x86)'Jenkins'workspace'release_dotnet_master'Lib'ClassLibraryCommon'Core'Executor'Executor.cs:line 677 --- End of inner exception stack trace --- at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand 1 cmd, IRetryPolicy policy, OperationContext OperationContext)在c:'Program Files (x86)'Jenkins'workspace' release_dotnet_master'Lib'ClassLibraryCommon'Core'Executor'Executor.cs:line 604在Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer。CreateIfNotExists(BlobContainerPublicAccessType accessType, BlobRequestOptions requestOptions, OperationContext OperationContext)在c:'Program Files (x86)'Jenkins'workspace' release_dotnet_master'Lib'ClassLibraryCommon'Blob'CloudBlobContainer.cs:第199行在WorkerRoleWithSBQueue1.WorkerRole。b__4_0 (BrokeredMessage receivedMessage)

Azure Worker角色和blob存储Microsoft.WindowsAzure.Storage.StorageE

查看您的代码,您正在执行以下操作:

string msg = "Container Name: " + receivedMessage.GetBody<String>();

然后你要做以下事情:

        imagesContainer = blobClient.GetContainerReference(msg);
        // Create the container if it doesn't already exist.
        imagesContainer.CreateIfNotExists();

所以基本上你正在创建一个以Container Name开头的容器名称,这是容器名称的无效值。这就是你得到错误的原因。

请参阅此链接了解blob容器的有效命名约定:https://msdn.microsoft.com/en-us/library/azure/dd135715.aspx.