2015-01-31 11 views
5

Trascorrere molte ore per provare a risolvere questo problema.Tabella query di Azure con firma di accesso condiviso La restituzione non è stata implementata, ma con la stringa di connessione funziona

Ho una tabella e desidero creare un SAS di sola lettura e fornire ai componenti client l'accesso in lettura. Ma non ci riesci mai.

Se basta usare stringa di connessione e collegare direttamente tabella simili:

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

Funziona bene. Ma con SAS come qui di seguito, restituisce sempre 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); 
} 

Provato modi diversi, danno meno di 1 ora di tempo, di nome o l'identificatore politica anonimo, utilizzare la firma Solo ("sig") per creare StorageCredentials. Tutto fallito con errori diversi. Per lo più 501 not implemented, a volte resource not found, a volte 403 Forbidden.

Impossibile trovare informazioni utili online. Sto usando l'SDK versione 3.1 Microsoft.WindowsAzure.Storage.

Ogni aiuto è molto apprezzato

risposta

4

Credo che il problema si trova nelle seguenti due righe di codice:

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

    var _manifestFilterCloudTable = tableClient.GetTableReference(GlobalFilterTable); 

Fondamentalmente ciò che sta accadendo è che il nome della tabella viene ripetuto due volte nel URL tavolo manifestFilterCloudTable. Quando si crea CloudTableClient, l'URI non dovrebbe includere il nome della tabella. Dovrebbe essere qualcosa come https://[youraccountname].table.core.windows.net.

Si prega di utilizzare il seguente codice nel metodo AccessTable:

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

Un'altra cosa che ho notato che per SharedAccessPolicy, si sta utilizzando DateTime.Now. A seconda del fuso orario in cui viene eseguito il codice, è possibile che si verifichino errori 403 poiché data/ora in Azure è in UTC. Si prega di utilizzare DateTime.UtcNow invece.

+0

Hai inchiodato. Non riuscivo a trovarlo finché non lo fai notare. Rimuovendo il nome della tabella da uri fallo funzionare. Grazie mille. –

Problemi correlati