Рабочая роль Azure и хранилище больших двоичных объектов c # — Microsoft.WindowsAzure.Хранение.StorageException: удаленный сервер вернул ошибку: (400) Неверный запрос

#c# #azure #azure-worker-roles #azure-blob-storage

#c# #azure #azure-worker-roles #azure-blob-storage

Вопрос:

Я загрузил файлы в хранилище больших двоичных объектов. Я пытаюсь загрузить эти файлы из рабочей роли, чтобы выполнить некоторую обработку. Имя контейнера отправляется из WebApi2 в очередь.

Рабочая роль сначала извлекает имя контейнера из очереди, а затем пытается загрузить большие двоичные объекты в этот контейнер.

Ниже приведен код для имени:

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

Я получаю приведенное ниже исключение:

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

Ошибка: Microsoft.WindowsAzure.Хранение.Исключение StorageException: удаленный сервер вернул ошибку: (400) неверный запрос. —> System.Net.WebException: удаленный сервер вернул ошибку: (400) неверный запрос.
в System.Net.HttpWebRequest.GetResponse()
в Microsoft.WindowsAzure.Storage.Core.Исполнителя.Исполнителя.ExecuteSync[T](RESTCommand 1 cmd, IRetryPolicy policy, OperationContext operationContext) in c:Program Files (x86)Jenkinsworkspacerelease_dotnet_masterLibClassLibraryCommonCoreExecutorExecutor.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)Jenkinsworkspacerelease_dotnet_masterLibClassLibraryCommonCoreExecutorExecutor.cs: строка 604
в Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.CreateIfNotExists(BlobContainerPublicAccessType AccessType, BlobRequestOptions RequestOptions, OperationContext OperationContext) в c:Program Файлы (x86)Jenkinsworkspacerelease_dotnet_masterБиблиотека ClassLibraryCommonBlobCloudBlobContainer.cs:строка 199
в WorkerRoleWithSBQueue1.WorkerRole.b__4_0(BrokeredMessage receivedMessage)

Любая помощь будет высоко оценена.

Комментарии:

1. Какое имя контейнера, который вы пытаетесь создать? ошибка 400 во время создания контейнера обычно указывает на недопустимое имя контейнера.

2. Можете ли вы получить доступ к любому большому двоичному объекту из контейнера через общедоступный http-URL?

Ответ №1:

Просматривая ваш код, вы делаете следующее:

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

И затем вы делаете следующее:

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

Итак, по сути, вы создаете контейнер, имя которого начинается с Container Name , что является недопустимым значением для имени контейнера. Вот почему вы получаете ошибку.

Пожалуйста, смотрите эту ссылку для действительного соглашения об именовании для контейнера больших двоичных объектов: https://msdn.microsoft.com/en-us/library/azure/dd135715.aspx .

Комментарии:

1. Да, сэр. Код принимал имя контейнера как «Имя контейнера:» msg», что было неверно. Имя контейнера было только значением в строке ‘msg’.

2. Пожалуйста. Не уверен, видели ли вы мой комментарий о ключе учетной записи (я отметил ваш комментарий, содержащий ключ учетной записи, и он был удален). Если вы еще этого не сделали, пожалуйста, измените ключ своей учетной записи как можно скорее.