Не удается загрузить в azure хранилище Blob: на удаленном сервере появилась ошибка: (400) Bad Request

Я пытаюсь создать утилиту для загрузки файла из Интернета и загрузить его снова в хранилище Azure blob. Контейнеры Blob уже созданы хорошо; Но по какой-то причине я получаю исключение "Bad Request 400", когда я пытался загрузить файл на хранение... Создано имя контейнера, маленькие буквы, а также специальные символы. Но я до сих пор не знаю, почему я получаю исключение!

Пожалуйста, помогите.

Примечание:

  • Я не использую эмулятор... Непосредственно тестирую в облаке.
  • Все мои контейнеры с опцией доступа к "Public Container".

Вот исключение:

An exception of type 'Microsoft.WindowsAzure.Storage.StorageException' 
occurred in Microsoft.WindowsAzure.Storage.dll but was not handled in user code
Additional information: The remote server returned an error: (400) Bad Request.

И вот код:

foreach (var obj in objectsList)
{
     var containerName = obj.id.Replace("\"", "").Replace("_", "").Trim();
     CloudBlobContainer blobContainer = blobClient.GetContainerReference(containerName);

     if (blobContainer.Exists())
     {
         var fileNamesArr = obj.fileNames.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries);

         foreach (var sora in fileNamesArr)
         {
             int soraInt = int.Parse(sora.Replace("\"", ""));
             String fileName = String.Format("{0}.mp3", soraInt.ToString("000"));

             var url = String.Format("http://{0}/{1}/{2}", obj.hostName.Replace("\"", ""), obj.id.Replace("\"", ""), fileName.Replace("\"", "")).ToLower();

             var tempFileName = "temp.mp3";

             var downloadedFilePath = Path.Combine(Path.GetTempPath(), tempFileName).ToLower();

             var webUtil = new WebUtils(url);
             await webUtil.DownloadAsync(url, downloadedFilePath).ContinueWith(task =>
             {
                 var blobRef = blobContainer.GetBlockBlobReference(fileName.ToLower());
                 blobRef.Properties.ContentType = GetMimeType(downloadedFilePath);

                 using (var fs = new FileStream(downloadedFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
                 {
                     blobRef.UploadFromStream(fs); // <--- Exception
                 }
             });
         }
      }
      else
      {
          throw new Exception(obj.id.Replace("\"", "") + " Container not exist!");
      }
}

Изменить: исключение хранения

Microsoft.WindowsAzure.Storage.StorageException: удаленный сервер ответил на ошибку: (400) Неверный запрос. --- > System.Net.WebException: удаленный сервер ответил на ошибку: (400) "Плохой запрос".    в System.Net.HttpWebRequest.GetRequestStream(TransportContext & контекст)    в System.Net.HttpWebRequest.GetRequestStream()    в Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync [T] (RESTCommand 1 cmd, IRetryPolicy policy, OperationContext operationContext) --- End of inner exception stack trace --- at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand 1 cmd, политика IRetryPolicy, OperationContext operationContext)    в Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStreamHelper(источник потока, длина Nullable1, доступ AccessConditionCondition, параметры BlobRequestOptions, операция OperationContextContext)    в Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStream(источник потока, AccessCondition accessCondition, параметры BlobRequestOptions, OperationContext operationContext)    в TelawatAzureUtility.StorageService. < > c__DisplayClass4.b__12 (задача задачи) в\psf\Главная\Documents\Visual Studio 14\Projects\Telawat Azure Utility\TelawatAzureUtility\StorageService.cs: строка 128 Запрашивать информацию RequestID: RequestDate: Сб, 28 июн 2014 20:12:14 GMT StatusMessage: неверный запрос

Изменить 2: Запросить информацию:

enter image description here

enter image description here

Изменить 3: проблема возникает из WebUtils.. Я заменил его на код ниже, и он работает! Я добавлю код weUtils, возможно, вы можете помочь узнать, в чем проблема с ним.

HttpClient client = new HttpClient();
var stream = await client.GetStreamAsync(url);

Код WebUtils:

public class WebUtils
{
    private Lazy<IWebProxy> proxy;

    public WebUtils(String url)
    {
        proxy = new Lazy<IWebProxy>(() => string.IsNullOrEmpty(url) ? null : new WebProxy {
            Address = new Uri(url), UseDefaultCredentials = true });
    }

    public IWebProxy Proxy
    {
        get { return proxy.Value; }
    }

    public Task DownloadAsync(string requestUri, string filename)
    {
        if (requestUri == null)
            throw new ArgumentNullException("requestUri is missing!");

        return DownloadAsync(new Uri(requestUri), filename);
    }

    public async Task DownloadAsync(Uri requestUri, string filename)
    {
        if (filename == null)
            throw new ArgumentNullException("filename is missing!");

        if (Proxy != null)
        {
            WebRequest.DefaultWebProxy = Proxy;
        }

        using (var httpClient = new HttpClient())
        {
            using (var request = new HttpRequestMessage(HttpMethod.Get, requestUri))
            {
                using (Stream contentStream = await (await httpClient.SendAsync(request)).Content.ReadAsStreamAsync())
                {
                    using (var stream = new FileStream(filename, FileMode.Create, FileAccess.Write))
                    {
                        contentStream.CopyTo(stream);
                        stream.Flush();
                        stream.Close();
                    }
                    contentStream.Close();
                }
            }
        }
    }
}

Также, когда я пробовал этот код... "Wait" никогда не закончится и не завершится!

webUtil.DownloadAsync(url, downloadedFilePath).Wait()

Ответ 1

Вы пытались создать контейнер вручную на лазурном портале? У него есть некоторые ограничения на то, какое имя вы можете предоставить контейнерам.

Например: имя контейнера не может содержать буквы верхнего регистра.

Если вы запрашиваете контейнер с недопустимым именем, это приведет к ошибке (400) Bad Request, которую вы получаете. Поэтому проверьте строку "containerName".

Ответ 2

Я также получил эту ошибку с очередями сообщений Azure Storage Message.

Названия очереди сообщений в Azure также должны быть в нижнем регистре. т.е.: имя "newqueueitem" в нижнем регистре.

// Retrieve a reference to a queue.
CloudQueue queue = queueClient.GetQueueReference("newqueueitem");

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

Ответ 3

У меня был совсем другой случай сообщения с плохим запросом. Проводка здесь для всех, кто может поразить то же самое. В моем случае я просто перемещал ресурсы по другим группам ресурсов. В этом перетасовке ошибка в лазурке позволила мне указать мое хранилище на место ( "Юго-Восточная Азия" ), которого не было в моем регионе. Таким образом, все запросы к учетной записи хранилища возвратили сообщение с плохим запросом. Мне потребовалось некоторое время, чтобы понять это, потому что я создал еще одну учетную запись для проверки, которая при создании лазурного не позволила мне выбрать "Юго-Восточную Азию" в качестве места выбора, поэтому я выбрал другое место ( "Восточная Азия" "), и тогда все сработало нормально.

Ответ 4

Я столкнулся с той же проблемой при создании очереди в Azure с одним UpperCase Letter из моего кода С#. Ошибка была с именем очереди. Все символы должны быть строчными. После изменения всех символов в нижний регистр это сработало! :)

//Retrieve a reference to a queue
CloudQueue queue = queueClient.GetQueueReference("myqueue");
//Create a queue if it alredy doen't exists
queue.CreateIfNotExists();

Ответ 5

Ответ Талха Джунаид - вот что стало причиной моей проблемы. У меня была строчная буква в моей строке ссылки на очередь.

Ответ 6

Если вы создадите контейнер с недопустимым именем, это приведет к (400) неверному запросу. Существует несколько соглашений для создания имени контейнера, как показано ниже:

  1. Имена контейнеров должны начинаться с буквы или цифры и могут содержать только буквы, цифры и тире (-).
  2. Каждому символу тире (-) должен предшествовать сразу за буквой или цифрой; последовательные тире не допускаются в именах контейнеров.
  3. Все буквы в имени контейнера должны быть строчными.
  4. Имена контейнеров должны быть длиной от 3 до 63 символов.

Источник: https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata