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

Я загрузил файлы в хранилище BLOB-объектов. Я пытаюсь загрузить эти файлы из рабочей роли, чтобы обработать их. Имя контейнера отправляется из 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.Storage.StorageException: удаленный сервер возвратил ошибку: (400) неверный запрос. ---> System.Net.WebException: удаленный сервер вернул ошибку: (400) неверный запрос. в System.Net.HttpWebRequest.GetResponse () в Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync [T] (команда RESTCommand1 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](RESTCommand1, политика IRetryPolicy, OperationContext operationContext) в c: \ Program Files (x86) \ Jenkins \ release_dotnet_master \ Lib \ ClassLibraryCommon \ Core \ Executor \ Executor.cs: строка 604 в Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.CreateIfNotExists (BlobContainerPublicAccessType accessType, BlobContainerPublicAccessType accessType, BlobRequestOtext Operation \ RequestOtext, BlobRequestOtext) \ workspace \ release_dotnet_master \ Lib \ ClassLibraryCommon \ Blob \ CloudBlobContainer.cs: строка 199 в WorkerRoleWithSBQueue1.WorkerRole.b__4_0 (полученное сообщение BrokeredMessage)

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


person Dhvani Shah    schedule 11.10.2016    source источник
comment
Как называется контейнер, который вы пытаетесь создать? Ошибка 400 во время создания контейнера обычно указывает на недопустимое имя контейнера.   -  person Gaurav Mantri    schedule 11.10.2016
comment
Можете ли вы получить доступ к любому BLOB-объекту из контейнера через общедоступный URL-адрес http?   -  person Minh Nguyen    schedule 12.10.2016


Ответы (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.

person Gaurav Mantri    schedule 12.10.2016
comment
Да, SIr. Код принимал имя контейнера как имя контейнера: + msg, что было неверно. Имя контейнера было только значением в строке «msg». - person Dhvani Shah; 13.10.2016
comment
Пожалуйста. Не уверен, что вы видели мой комментарий о ключе учетной записи (я пометил ваш комментарий, содержащий ключ учетной записи, и он был удален). Если вы еще этого не сделали, пожалуйста, измените ключ своей учетной записи как можно скорее. - person Gaurav Mantri; 13.10.2016