2016-10-11 3 views
0

Ich habe Dateien im BLOB-Speicher hochgeladen. Ich versuche, diese Dateien von der Worker-Rolle herunterzuladen, um etwas daran zu verarbeiten. Der Containername wird vom WebApi2 an die Warteschlange gesendet.Azure Worker-Rolle und Blobspeicher C# - Microsoft.WindowsAzure.Storage.StorageException: Der Remoteserver hat einen Fehler zurückgegeben: (400) Ungültige Anforderung

Die Worker-Rolle ruft zuerst den Containernamen aus der Warteschlange ab und versucht dann, die Blobs innerhalb dieses Containers herunterzuladen.

Unten ist der Code für den Namen:

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

Ich bin die unten Ausnahme beim Abrufen:

enter code hereException thrown: 'Microsoft.WindowsAzure.Storage.StorageException' in Microsoft.WindowsAzure.Storage.dll 

Fehler: Microsoft.WindowsAzure.Storage.StorageException: Der Remoteserver hat einen Fehler zurückgegeben: (400) Schlechte Anfrage. ---> System.Net.WebException: Der Remote-Server hat einen Fehler zurückgegeben: (400) Ungültige Anforderung. bei System.Net.HttpWebRequest.GetResponse() bei Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync [T] (RESTCommand 1 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](RESTCommand 1 cmd, IRetryPolicy Politik, Operationoperation) in c: \ Program Files (x86) \ Jenkins \ workspace \ release_dotnet_master \ Lib \ ClassLibraryCommon \ Core \ Executor \ Executor.cs: Zeile 604 bei Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.CreateIfNotExists (BlobContainerPublicAccessType accessType, BlobRequestOptions requestOptions, OperationContext operationContext) in C: \ Programme (x86) \ Jenkins \ Arbeitsplatz \ release_dotnet_master \ Lib \ ClassLibraryCommon \ Blob \ CloudBlobContainer.cs: Linie 199 bei WorkerRoleWithSBQueue1.WorkerRole.b__4_0 (BrokeredMessage receivedMessage)

Jede Hilfe wäre hoch geschätzt.

+0

Wie lautet der Name des Containers, den Sie erstellen möchten? Ein 400-Fehler zum Zeitpunkt der Containererstellung weist normalerweise auf einen ungültigen Namen für den Container hin. –

+0

Können Sie auf einen beliebigen Blob aus dem Container über die öffentliche HTTP-URL zugreifen? –

Antwort

1

in Ihrem Code Sie suchen, Sie tun das folgende:

string msg = "Container Name: " + receivedMessage.GetBody<String>(); 

Und dann sind Sie wie folgt vorgehen:

 imagesContainer = blobClient.GetContainerReference(msg); 
     // Create the container if it doesn't already exist. 
     imagesContainer.CreateIfNotExists(); 

Also im Grunde sind Sie einen Container Namen, von denen die Schaffung beginnt mit Container Name, was ein ungültiger Wert für den Containername ist. Deshalb erhalten Sie den Fehler.

Bitte beachten Sie diesen Link für gültige Namenskonvention für Blob-Container: https://msdn.microsoft.com/en-us/library/azure/dd135715.aspx.

+0

Yeaa SIr. Der Code nahm Containername als "Container Name:" + msg "was falsch war. Der Container-Name war nur der Wert in der Zeichenfolge 'msg'. –

+0

Thanxx viel Sir. –

+0

Gern geschehen. Nicht sicher, ob Sie gesehen haben mein Kommentar zum Kontoschlüssel (Ich habe Ihren Kommentar mit dem Kontoschlüssel markiert und er wurde gelöscht.) Wenn Sie dies noch nicht getan haben, ändern Sie bitte Ihren Kontoschlüssel so schnell wie möglich. –

Verwandte Themen