2017-03-09 4 views
2

Ich habe ein kleines IoT-Projekt, mit dem ich schwinde, und es greift im Grunde nur auf meine neueste Sensortelemetrie von meinem "intelligenten" Haus und zeigt sie auf dem Formular in einem sehr standardmäßigen Xamarin an Anwendung.Verbinden mit Azure-Storage-Tabellen in Xamarin

Meine Fragen rund um den Einsatz von Xamarin und Azure.Storage sind:

Ich habe 3 Tabellen, die ich in meiner app herunterladen:

public DeviceReadingsReader() 
{ 
    _deviceReadingsTable = TableClient.GetTableReference("DeviceReadings"); 
    _locationsTable = TableClient.GetTableReference("Locations"); 
    _goalsTable = TableClient.GetTableReference("TemperatureGoals"); 
} 

Wie Sie sagen, sie alle Bezug ein TableClient, die ich mit einem älteren, PCL-kompatibelen NuGet Paket (eine Frage: warum sind nicht die neuesten azure.storage Pakete können in Xamarin.Forms ?? installieren) gefunden

auf UWP und iOS, habe ich kein Problem Dies tun:

var cloudStorageAccount = CloudStorageAccount.Parse(connectionstring); 
    _tableClient = storageAccount.CreateCloudTableClient(); 

Allerdings, wenn ich diesen Code auf Android laufen lasse, erhalte ich eine Ausnahme demmanding, dass ich Token stattdessen eine SAS verwenden, so habe ich eine SaS-Token in dem Azure-Portal für das Storage-Konto, mit einer 2-jährigen Laufzeit , und verwenden Sie es wie folgt:

Allerdings läuft dies auf Android, iOS oder UWP gibt mir eine Autorisierung fehlgeschlagen Nachricht, die angibt, dass mein SaS-Token ungültig ist.

Weiß jemand, was ich falsch mache, und wie man ein Stück Code schreibt, der tatsächlich auf allen 3 Plattformen ausgeführt wird?

var sas = "https://0000000000000.table.core.windows.net/?sv=2016-05-31&ss=bfqt&srt=sco&sp=rwdlacup&se=2019-03-08T23:51:51Z&st=2017-03-08T15:51:51Z&spr=https&sig=0000000000000000000000000000000000000000000000&comp=list&restype=table"; 
StorageCredentials creds = new StorageCredentials(sas); 
CloudStorageAccount cloudStorageAccount = new CloudStorageAccount(creds, null, null, new Uri("https://0000000000000.table.core.windows.net/"), null); 
_tableClient = cloudStorageAccount.CreateCloudTableClient();   

Edit: Ich bin mir bewusst, dass ich eine Wolke API die gleichen Werte abzurufen machen könnte, und alles dies würde weggehen, aber das ist nur Werte aus einem Speicher Tisch zu bekommen, und ich wirklich don‘ t die Notwendigkeit, eine dazwischen WebAPI zu schaffen für sie

Hier ist die Ausnahme:

<RequestResult> 
    <HTTPStatusCode>403</HTTPStatusCode> 
    <HttpStatusMessage>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.</HttpStatusMessage> 
    <TargetLocation>Primary</TargetLocation> 
    <ServiceRequestID>926f8520-0002-0033-02b2-98bab7000000</ServiceRequestID> 
    <ContentMd5 /> 
    <Etag /> 
    <RequestDate>Thu, 09 Mar 2017 09:55:29 GMT</RequestDate> 
    <StartTime>Thu, 09 Mar 2017 08:55:28 GMT</StartTime> 
    <EndTime>Thu, 09 Mar 2017 08:55:30 GMT</EndTime> 
    <Error> 
    <Code>AuthenticationFailed</Code> 
    <Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. 
RequestId:926f8520-0002-0033-02b2-98bab7000000 
Time:2017-03-09T08:55:32.7622395Z</Message> 
    </Error> 
    <ExceptionInfo> 
    <Type /> 
    <HResult>-2147467259</HResult> 
    <Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.</Message> 
    <Source>Microsoft.WindowsAzure.Storage</Source> 
    <StackTrace> at Microsoft.WindowsAzure.Storage.Core.Executor.Executor+&lt;ExecuteAsyncInternal&gt;d__0`1[T].MoveNext() [0x007eb] in &lt;03db1448eaed4d018343fcf0153c030d&gt;:0 </StackTrace> 
    </ExceptionInfo> 
</RequestResult> 
+0

Können Sie teilen, wie Ihr SAS-Token aussieht? Verdecken Sie einfach den 'sig' Teil in Ihrem SAS. Teilen Sie auch den Code mit, bei dem der Fehler Autorisierung fehlgeschlagen ist. –

+0

Der ursprüngliche Post wurde neu geschrieben, um das SAS-Token und die Ausnahmebedingungsnachricht einzuschließen. Ich habe mit Varianten des SAS-Token vergeblich experimentiert (einschließlich/ohne die URL, Hinzufügen ** Restype ** als Tipp von einem anderen Beitrag auch nicht geholfen –

Antwort

2

Also gibt es ein Problem mit der Art und Weise Sie zum SAS verwenden. Sie verwenden die SAS-URL. Bitte verwenden Sie nur den Abfragezeichenfolgeflag Teil:

So Sollte Ihr SAS so etwas wie:

var sas = „sv = 2016.05.31 & ss = bfqt & srt = sco & sp = rwdlacup & se = 2019-03-08T23: 51: 51Z & st = 2017-03-08T15: 51: 51Z & spr = https & sig = 0000000000000000000000000000000000000000000000 ";

Probieren Sie es aus.

+0

Das war es, danke :) –