Xamarin Azure Blob Storage

Letzens habe ich im ppedv Blog über das speichern eines Images in der Cloud geschrieben. Man denkt man nimmt den C# Code aus der UWP App per Copy Paste in das Xamarin Cross Plattform Projekt. Pustekuchen!

Zunächst kompiliert der Source Code des Android Projektes nicht, obwohl per Nuget die aktuellste Version 7 des Azure Bibliothek WindowsAzure.Storage eingebunden ist.

image

Nach einiger Recherche und probieren klappt es mit Version 4.4 oder der Preview von 7.0.1.

Allerdings wird zur Laufzeit eine Exception ausgelöst bei Anlegen des CloudBlobClient

System.NotSupportedException: Shared Key is not supported using the PCL. Please use a SAS token.

Man kann in Xamarin also nicht mit der Kombination aus AccountName und Account Key die Authentifizierung beim Blob Service durchführen. Man muss eine SAS Url generieren. Um diese zu erzeugen wird die Azure Powershell verwendet und folgende Kommandos per Copy Paste ausgeführt. Natürlich ist der Key und Name mit den eigenen Werten aus dem Azure Portal zu ersetzen.

   1:   $context = New-AzureStorageContext -StorageAccountName "xamari" -StorageAccountKey "d=="
   2:   New-AzureStorageContainer img -Permission Off -Context $context
   3:   $now = Get-Date
   4:   New-AzureStorageContainerSASToken -Name img -Permission rwdl -ExpiryTime $now.AddDays(1.0) 
-Context $context -FullUri

Wenns klappt erhält man eine URL die man einfach kopiert.

image

Da wir nun diesen SAS URL String haben, geht's weiter mit dem Upload, hier eines Filestreams zum Azure Blob Storage.

   1:  var sas = "https://xamarindevimages.blob.core.windows.net/img?sv=2014-02-14&sr=c&sig=
9uE4oHmg8Yv7dINeye75QttJzRWrcxrgKg6uP3PdQAw%3D&se=2016-05-07T18%3A55%3A36Z&sp=rwdl"
;
   2:  CloudBlobContainer container = new CloudBlobContainer(new Uri(sas));
   3:  CloudBlockBlob blockBlob = container.GetBlockBlobReference("hannes1.jpg");
   4:  if (!await blockBlob.ExistsAsync())
   5:     {
   6:     var s = file.GetStream();
   7:     await blockBlob.UploadFromStreamAsync(s);
   8:     file.Dispose();
   9:     }

 

Soweit so gut. Wie man sieht ist Cross Plattform mit Einschränkungen im Detail versehen. Diese lernen Sie bei uns im Xamarin Camp in 5 Tagen kennen.

Kommentare sind geschlossen