web-dev-qa-db-ja.com

Azure Blob Storageにアップロードできません:リモートサーバーがエラーを返しました:(400)Bad Request

インターネットからファイルをダウンロードして、Azure Blob Storageに再度アップロードするユーティリティを作成しようとしています。 Blobコンテナーは既に適切に作成されています。しかし、何らかの理由で、ファイルをストレージにアップロードしようとすると「Bad Request 400」例外が発生します...コンテナ名が作成されるので、小文字なので特殊文字です。しかし、なぜ例外が発生するのかはまだわかりません!

助けてください。

  • エミュレータを使用していません...クラウドで直接テストしています。
  • 「パブリックコンテナー」アクセスオプションを持つすべてのコンテナー。

ここに例外があります:

_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)Bad Request。 ---> System.Net.WebException:リモートサーバーがエラーを返しました:(400)Bad Request。 System.Net.HttpWebRequest.GetRequestStream(TransportContext&context)at System.Net.HttpWebRequest.GetRequestStream()at 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](RESTCommand 1 cmd、IRetryPolicy Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStream(Stream sourceでポリシー、OperationContext operationContext)をMicrosoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStreamHelper(Stream source、Nullable`1 length、AccessCondition accessCondition、BlobRequestOptions options、OperationContext operationContext)で、AccessCondition accessCondition、BlobRequestOptionsオプション、OperationContext operationContext)at TelawatAzureUtility.StorageService。<> c__DisplayClass4.b__12(Task task)in\psf\Home\Documents\Visual Studio 14\Projects\Telawat Azure Utility\TelawatAzureUtility\StorageService.cs:line 128リクエスト情報RequestID:RequestDate:Sat、28 Jun 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();
                }
            }
        }
    }
}
_

また、このコードを試したところ、「Wait」が完了または完了しません。

_webUtil.DownloadAsync(url, downloadedFilePath).Wait()
_
13
bunjeeb

Azure portalで手動でコンテナーを作成してみましたか?コンテナに付ける名前にはいくつかの制限があります。

例:コンテナ名に大文字を含めることはできません。

無効な名前のコンテナーを要求すると、(400)Bad Requestが発生し、これが取得されます。 「containerName」の文字列を確認してください。

34
siddhant

Azure Storage Message Queuesでもこのエラーが発生しました。

Azure Storageメッセージキューの名前もすべて小文字にする必要があります。つまり、小文字の「newqueueitem」名。

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

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

無効な名前でコンテナを作成すると、(400)Bad Requestが発生します。コンテナ名の作成には、次のような規則があります。

  1. コンテナー名は文字または数字で始まる必要があり、文字、数字、およびダッシュ(-)文字のみを含めることができます。
  2. すべてのダッシュ(-)文字の直前と直後に文字または数字が必要です。コンテナー名に連続したダッシュは使用できません。
  3. コンテナ名のすべての文字は小文字でなければなりません。
  4. コンテナ名は3〜63文字である必要があります。

ソース: https://docs.Microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata

2
Khabir

リクエストメッセージが非常に悪い場合がありました。同じことをする可能性のある人のためにここに投稿する。私の場合、他のリソースグループ間でリソースを移動していました。そのシャッフルでは、Azureのバグにより、私のストレージを私の地域では利用できない場所(「東南アジア」)に向けることができました。そのため、ストレージアカウントに対するすべての要求は、不正な要求メッセージを返しました。次に、テストする別のストレージアカウントを作成したため、これを理解するのにしばらく時間がかかりました。作成するときに、Azureでは「南東アジア」を選択する場所として選択できなかったため、別の場所(「東アジア」を選択しました")そして、すべてがうまくいきました。

1
Metal Latem

AzureでC#コードの1つの大文字を使用してキューを作成するときに、同じ問題に直面しました。エラーはキュー名にありました。すべての文字は小文字でなければなりません。すべての文字を小文字に変更した後、うまくいきました! :)

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