2016-05-05 16 views
0

Ich habe Probleme mit der Aktualisierung eines MobileService auf den Azure App Service gehabt. Ich hatte die folgende Frage Blob storage access from Azure App Service, die mir ermöglichte, auf den Blobspeicher zuzugreifen. Nun wollte ich ein Bild in den Blob Speicher speichern, die der aktualisierte Code ist wie folgt:Blob-Container für Azure App Service erstellen

string cloud = ""; 

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("battlecrestimage_AzureStorageConnectionString")); 
cloud = storageAccount.BlobEndpoint.ToString() + "  " + storageAccount.BlobStorageUri.ToString(); 

// Create the blob client. 
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
if (item.ContainerName != null) 
{ 
    // Set the BLOB store container name on the item, which must be lowercase. 
    item.ContainerName = item.ContainerName.ToLower(); 

    // Create a container, if it doesn't already exist. 
    CloudBlobContainer container = blobClient.GetContainerReference(item.ContainerName); 

    try 
    { 
      await container.DeleteIfExistsAsync(); 
      telemetry.TrackTrace("Deleted."); 
    } 
    catch 
    { 
      telemetry.TrackTrace("Could not DeleteIfExist."); 
    } 
    await container.CreateIfNotExistsAsync(); //Code fails at this point 

    // Create a shared access permission policy. 
    BlobContainerPermissions containerPermissions = new BlobContainerPermissions(); 

    // Enable anonymous read access to BLOBs. 
    containerPermissions.PublicAccess = BlobContainerPublicAccessType.Blob; 
    container.SetPermissions(containerPermissions); 

    // Define a policy that gives write access to the container for 5 minutes.         
    SharedAccessBlobPolicy sasPolicy = new SharedAccessBlobPolicy() 
    { 
     SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(5), 
     Permissions = SharedAccessBlobPermissions.Write 
    }; 

    // Get the SAS as a string. 
    item.SasQueryString = container.GetSharedAccessSignature(sasPolicy); 

    // Set the URL used to store the image. 
    item.ImageUri = string.Format("{0}{1}/{2}", storageAccount.BlobEndpoint, 
    item.ContainerName, item.ResourceName); 
} 

Ich kann nicht verstehen, warum der Code bei await container.CreateIfNotExistsAsync(); ausfällt. Kann jemand klären, wie der richtige Weg ist, den Blobspeicher und die URI zu erstellen? Um dies an einen Kunden zurückzugeben.

aktualisiert

Hier ist die Stack-Ausgabe von der Diagnoseübersicht.

Operation=blobStorageCreationController.ExecuteAsync, Exception=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 Microsoft.WindowsAzure.Storage.Shared.Protocol.HttpResponseParsers.ProcessExpectedStatusCodeNoException[T](HttpStatusCode expectedStatusCode, HttpStatusCode actualStatusCode, T retVal, StorageCommandBase 1 cmd, Exception ex) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\Common\Shared\Protocol\HttpResponseParsers.Common.cs:line 50 at Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.b__34(RESTCommand 1 cmd, HttpWebResponse resp, Exception ex, OperationContext ctx) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlobContainer.cs:line 2620 at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.EndGetResponse[T](IAsyncResult getResponseResult) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs:line 299 --- End of inner exception stack trace --- at Microsoft.WindowsAzure.Storage.Core.Util.StorageAsyncResult 1.End() in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Util\StorageAsyncResult.cs:line 77 at Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.EndCreateIfNotExists(IAsyncResult asyncResult) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlobContainer.cs:line 381 at Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.<>c__DisplayClass1 1.b__0(IAsyncResult ar) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Util\AsyncExtensions.cs:line 66 --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() at BCAppService.Controllers.blobStorageCreationController.d__1.MoveNext() in C:\BCApp_Runtime\BCAppService\Controllers\blobStorageController.cs:line 248

Zum Zeitpunkt der Erstellung existiert kein Blob.

+0

könnten Sie den Namen des Containers sagen, den Sie erstellen möchten? –

+1

Überprüfen Sie diesen Artikel: http://stackoverflow.com/questions/19599819/azure-blob-400-bad-request-on-creation-of-container, um zu sehen, ob das Ihr Problem ist. –

+0

@AlexBelotserkovskiy war es wie du den Namen sagst. Nach dem Upgrade des Dienstes hatte ich die ID von einem int in einen String geändert. Die Zeichenfolge hatte ein _, was das Problem war. Ich werde die Frage morgen löschen, da dies nichts beiträgt. – JTIM

Antwort

2

Ist der Blob-Container beim Ausführen dieses Code-Snippets bereits vorhanden?

Wenn ja, müssen Sie wissen, dass die Löschoperation keine Sofortoperation ist. Sobald die Löschanforderung ausgegeben wird, wird der Container Tabelle vom Speicherdienst zum Löschen markiert und darf nicht mehr zugänglich sein. Es wird später vom Garbage Collector gelöscht. Wenn dies der Fall ist, sollten Sie einen 409 (Konflikt) Fehler in der markierten Zeile bekommen.

+0

Nein, das ist nicht das Problem Ich bin gerade dabei, die Frage zu aktualisieren. Es ist eine 400 Bad Anfrage – JTIM

+0

@JTIM könnten Sie die Details der Ausnahme speziell überprüfen ** HttpStatusMessage **, die weitere Details zu dieser 400 schlechten Anfrage geben wird. Wenn Sie Visual Studio verwenden, können Sie Ausnahmedaten wie [this] (http://i.stack.imgur.com/hcBoI.png) überprüfen. In meinem Fall geben ungültige Zeichen in Containername eine 400 ungültige Anforderungsausnahme zurück. – forester123