gpt4 book ai didi

azure - 使用共享访问签名查询 Azure 表返回未实现,但使用连接字符串可以工作

转载 作者:行者123 更新时间:2023-12-02 12:49:52 25 4
gpt4 key购买 nike

花很多时间尝试解决这个问题。

我有一个表,想要创建一个只读 SAS 并给予客户端组件读取访问权限。但永远不会成功。

如果只是使用连接字符串并直接连接表,如下所示:

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

效果很好。但对于像下面这样的 SAS,总是返回 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);
}

尝试了不同的方法,给出不到 1 小时的时间,命名或匿名策略标识符,仅使用签名(“sig”)来创建 StorageCredentials。全部失败并出现不同的错误。大多数情况下501未实现,有时找不到资源,有时403禁止

在线找不到有用的信息。我正在使用 Microsoft.WindowsAzure.Storage 版本 3.1 SDK。

非常感谢任何帮助

最佳答案

我认为问题出在以下两行代码中:

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

var _manifestFilterCloudTable = tableClient.GetTableReference(GlobalFilterTable);

基本上,发生的情况是表名称在 manifestFilterCloudTable 的表 URL 中重复两次。创建 CloudTableClient 时,URI 不应包含表名称。它应该只是类似于 https://[youraccountname].table.core.windows.net

请在您的 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);

我注意到的另一件事是,对于 SharedAccessPolicy,您使用的是 DateTime.Now。根据执行代码的时区,您可能会遇到 403 错误,因为 Azure 中的日期/时间采用 UTC。请改用 DateTime.UtcNow

关于azure - 使用共享访问签名查询 Azure 表返回未实现,但使用连接字符串可以工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28254270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com