2014-06-28 18 views
8

İnternet'ten dosya indirmek ve Azure blob depolama alanına yeniden yüklemek için bir yardımcı program oluşturmaya çalışıyorum. Blob konteynerleri zaten iyi oluşturulmuş; Ama bir sebepten dolayı dosyaya depolamayı denediğimde "Bad Request 400" istisnası alıyorum ... Kapsayıcı adı oluşturuldu, küçük harfler, çok özel karakterler. Ama hala neden istisna alıyorum bilmiyorum!Azure'a yüklenemiyor Blob Depolama: Uzak sunucu bir hata verdi: (400) Hatalı İstek

Lütfen

Yardım edin.

Not:

  • ben Doğrudan bulut test ... herhangi emülatör kullanmıyorum.
  • Tüm kaplarım "Genel Kapsayıcı" erişim seçeneğiyle. İşte

istisnadır:

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. 

Ve burada kodudur:

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!"); 
     } 
} 

Düzenleme: Depolama İstisna

Microsoft.WindowsAzure.Storage.StorageException: The remote server returned an error: (400) Bad Request. ---> System.Net.WebException: The remote server returned an error: (400) Bad Request. at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context) at System.Net.HttpWebRequest.GetRequestStream() at 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 policy, OperationContext operationContext) at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStreamHelper(Stream source, Nullable`1 length, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext) at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStream(Stream source, AccessCondition accessCondition, BlobRequestOptions options, 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 Request Information RequestID: RequestDate:Sat, 28 Jun 2014 20:12:14 GMT StatusMessage:Bad Request

Düzenleme 2: isteğinde Bilgi:

enter image description here

enter image description here

Düzenleme 3: .. Ben kodunun altına ile değiştirdiğini ve çalıştığını sorun WebUtils geliyor! WeUtils kodunu ekleyeceğim, belki de sorunun ne olduğunu bilmenize yardımcı olabilirsiniz.

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

WebUtils Kodu: Bu kodu çalışırken

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

Ayrıca ... bitirmek veya tamamlanmış asla 'bekle'!

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

Hangi depolama alanı kitaplığı sürümünü kullanıyorsunuz? Fiddler aracılığıyla istek/cevap izleyebilir misiniz? Bu size 400 hatasıyla ilgili daha fazla ayrıntı vermelidir. –

+0

Nuget: ... Şimdi fiddler ile kontrol edeceğim. – bunjeeb

+0

Lütfen Fiddler'ın çalışmasıyla yardımcı programını çalıştırın, böylece isteği/yanıtı yakalayabilir ve burada paylaşabilirsiniz. –

cevap

20

Azure portalında elle bir kap oluşturmayı denediniz mi? Kaplara ne ad verebileceğiniz konusunda bazı sınırlamalar vardır.

Örneğin: Kapsayıcı adı büyük harf içermiyor.

Geçersiz bir ada sahip bir kapsayıcı isteğinde bulunursanız, bunun sonucunda (400) Kötü İsteği sonuçlanır. Yani "containerName" dizginizi kontrol edin.

+3

Bu bana yardımcı oldu. Konteyner ismimin başlangıcında büyük bir mektubum vardı ama Azure'da hepsi küçüktü. – user1352057

1

Çok farklı bir kötü istek iletisindeyim. Aynı şeyi vurabilecek herkes için buraya gönderiyorum. Benim durumumda, diğer kaynak gruplarında kaynak etrafında dolaşıyordum. Bu kargaşada, masmavi bir böcek, benim bölgemde mevcut olmayan depolamamın yerini (“Güney Doğu Asya”) göstermeme izin verdi. Bu nedenle, depolama hesabına yönelik tüm talepler, kötü istek iletisini döndürdü. Bunu anlamak için biraz zamanımı harcadım çünkü daha sonra test etmek için başka bir depolama hesabı oluşturdum. Azure, "Güney Doğu Asya" yı seçmemin bir yeri olarak seçmeme izin vermedi, bu yüzden başka bir yer seçtim ("Doğu Asya" ") ve sonra her şey iyi çalıştı.

0

Ayrıca bu hatayı Azure Depolama İleti Kuyrukları ile aldım.

Azure Storage Message Queue adlarının tümü de küçük harf olmalıdır. ie: "newqueueitem" adı küçük harfle.

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

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