2015-01-31 4 views
5

Verbringen Sie viele Stunden, um dies zu beheben.Azure-Tabelle mit Shared Access abfragen Signatur-Rückgabe nicht implementiert, aber mit Verbindungszeichenfolge funktioniert

Ich habe eine Tabelle und möchte eine schreibgeschützte SAS erstellen und den Clientkomponenten Lesezugriff gewähren. Aber nie erfolgreich sein.

Wenn nur Verbindungszeichenfolge verwenden und diese direkt wie Tisch Haken:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(SliStorageConnection); 

    // Create the table client. 
    CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); 

    var table = tableClient.GetTableReference(GlobalFilterTable); 

    TableOperation tableOperation = TableOperation.Retrieve<TableEntity>(FilterTablePartition, "filter1"); 
    TableResult tableResult = table.Execute(tableOperation); 

es gut funktioniert. Aber mit SAS wie unten, kehrt immer 501 Not Implemented

var policy = new SharedAccessTablePolicy 
    { 
     SharedAccessExpiryTime = DateTime.Now.AddMinutes(30), 
     Permissions = SharedAccessTablePermissions.Query 
    }; 

    string sas = table.GetSharedAccessSignature(
     policy, 
     null, 
     FilterTablePartition, 
     String.Empty, 
     FilterTablePartition, 
     String.Empty); 

    Uri tableSasUri = new Uri(table.Uri, sas); 
    AccessTable(tableSasUri.AbsoluteUri.ToString()); 

private static void AccessTable(string tableSas) 
{ 
    string filterTableBaseUrl = tableSas.Substring(0, tableSas.IndexOf('?')); 

    var filterTableSasCredentials = new StorageCredentials(tableSas.Substring(filterTableBaseUrl.Length)); 
    CloudTableClient tableClient = new CloudTableClient(new Uri(filterTableBaseUrl), filterTableSasCredentials); 

    var _manifestFilterCloudTable = tableClient.GetTableReference(GlobalFilterTable); 

    TableOperation tableOperation = TableOperation.Retrieve<TableEntity>(FilterTablePartition, "filter1"); 
    TableResult tableResult = _manifestFilterCloudTable.Execute(tableOperation); 
} 

Versuchte verschiedene Möglichkeiten, geben weniger als 1 Stunde Zeit, mit dem Namen oder anonyme Richtlinie Bezeichner verwenden Signatur nur („sig“) StorageCredentials zu erstellen. Alle sind mit verschiedenen Fehlern gescheitert. Meistens 501 not implemented, manchmal resource not found, manchmal 403 Forbidden.

Konnte nützliche Informationen online nicht finden. Ich verwende Microsoft.WindowsAzure.Storage Version 3.1 SDK.

hoch Jede Hilfe

Antwort

4

geschätzt wird glaube ich, das Problem in den folgenden zwei Codezeilen ist:

CloudTableClient tableClient = new CloudTableClient(new Uri(filterTableBaseUrl), filterTableSasCredentials); 

    var _manifestFilterCloudTable = tableClient.GetTableReference(GlobalFilterTable); 

Im Grunde ist das, was passiert ist, dass der Tabellenname zweimal in der Tabelle URL wiederholt in manifestFilterCloudTable. Wenn Sie CloudTableClient erstellen, sollte der URI den Tabellennamen nicht enthalten. Es sollte nur etwas wie https://[youraccountname].table.core.windows.net sein.

Bitte benutzen Sie den folgenden Code in Ihr AccessTable Methode:

 string filterTableBaseUrl = tableSas.Substring(0, tableSas.IndexOf('?')); 
     var filterTableSasCredentials = new StorageCredentials(tableSas.Substring(filterTableBaseUrl.Length)); 
     filterTableBaseUrl = filterTableBaseUrl.Substring(0, filterTableBaseUrl.LastIndexOf("/")); 
     tableClient = new CloudTableClient(new Uri(filterTableBaseUrl), filterTableSasCredentials); 

     var _manifestFilterCloudTable = tableClient.GetTableReference("Address"); 

     TableOperation tableOperation = TableOperation.Retrieve<TableEntity>(FilterTablePartition, "filter1"); 
     TableResult tableResult = _manifestFilterCloudTable.Execute(tableOperation); 

Eine andere Sache, die ich, dass für SharedAccessPolicy bemerkt, sind Sie DateTime.Now verwenden. Abhängig von der Zeitzone, in der der Code ausgeführt wird, können 403 Fehler auftreten, da Datum und Uhrzeit in Azure in UTC angegeben sind. Bitte verwenden Sie stattdessen DateTime.UtcNow.

+0

Sie haben es genagelt. Ich konnte es nicht finden, bis du es zeigst. Das Entfernen des Tabellennamens von Uri führt dazu, dass es funktioniert. Vielen Dank. –