it-swarm.com.ru

Невозможно загрузить в хранилище BLOB-объектов Azure: удаленный сервер возвратил ошибку: (400) Неверный запрос

Я пытаюсь создать утилиту для загрузки файла из Интернета и загрузки его снова в хранилище BLOB-объектов Azure. Контейнеры 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) Bad Request . в System.Net.HttpWebRequest.GetRequestStream (TransportContext & context) в System.Net.HttpWebRequest.GetRequestStream () в Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync [T] (RESTCommand1 cmd, IRetryPolicy policy, OperationContext operationContext) --- End of inner exception stack trace --- at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand1 cmd, политика IRetryPolicy, OperationContext operationContext) в Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStreamHelper (Источник потока, длина Nullable`1, параметры доступа AccessCondition, параметры BlobRequestOptions, операция OperationContextContext). в Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStream (источник потока, условие доступа AccessCondition, параметры BlobRequestOptions, операция OperationContext operationContext) в TelawatAzureUtility.StorageService. <> c__DisplayClass4.b__12 (Задача) в\psf\Home\Documents\Visual Studio 14\Проекты\Утилита Telawat Azure\TelawatAzureUtility\StorageService.cs: строка 128 Запрашивать информацию RequestID: RequestDate: Сб, 28 июня 2014 20:12:14 GMT StatusMessage: Bad Request

Правка 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();
                }
            }
        }
    }
}

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

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

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

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

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

31
siddhant

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

Имена очереди сообщений хранилища Azure также должны быть в нижнем регистре ..__, то есть: имя «newqueueitem» в нижнем регистре.

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

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

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

1
Metal Latem

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

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