【问题标题】:Azure Table Storage not saving all object propertiesAzure 表存储未保存所有对象属性
【发布时间】:2019-02-13 21:25:42
【问题描述】:

我的 Azure 表存储有问题。我想要实现的是保存 SharePoint 列表的 ChangeToken 以便正确使用 webhook。

代码如下:

public class TablesHelper
{
    private static readonly string TokenTableName = "TokenTable";

    public static async Task<ListChangeToken> GetChangeTokenForListAsync(string listId)
    {
        var retrieveOperation = TableOperation.Retrieve<ListChangeToken>("Lists", listId, new List<string>() { "ChangeToken" });
        var tableReference = await GetTableReferenceAsync(TokenTableName);
        var tableResult = await tableReference.ExecuteAsync(retrieveOperation);
        if(tableResult.Result != null)
        {
            return tableResult.Result as ListChangeToken;
        }
        return null;
    }

    public static async Task SaveChangeTokenForListAsync(ListChangeToken changeToken)
    {
        var insertOperation = TableOperation.Insert(changeToken);
        var tableReference = await GetTableReferenceAsync(TokenTableName);
        var result = await tableReference.ExecuteAsync(insertOperation);
    }

    private static async Task<CloudTable> GetTableReferenceAsync(string tableName)
    {
        var storageAccount = CloudStorageAccount.Parse(ConfigurationHelper.CloudStorage);
        var tableClient = storageAccount.CreateCloudTableClient();
        var reference = tableClient.GetTableReference(tableName);
        await reference.CreateIfNotExistsAsync();
        return reference;
    }
}

ListChangeToken 类:

public class ListChangeToken : TableEntity
{
    public ListChangeToken(string listId, string changeToken)
    {
        this.PartitionKey = "Lists";
        this.RowKey = listId;
        this.ChangeToken = changeToken;
    }

    public ListChangeToken() { }

    public string ChangeToken { get; set;}
}

根据请求,调用 TablesHelper 的函数:

 [FunctionName("EventHandler")]
    public static async Task Run([QueueTrigger("events", Connection = "CloudStorage")]string myQueueItem, TraceWriter log)
    {
        var notificationGroup = Newtonsoft.Json.JsonConvert.DeserializeObject<NotificationGroup>(myQueueItem);
        var contextHelper = new ContextHelper();
        foreach (var notification in notificationGroup.Value)
        {
            UriBuilder uriBuilder = new UriBuilder();
            uriBuilder.Scheme = "https";
            uriBuilder.Host = ConfigurationHelper.TenantDomain;
            uriBuilder.Path = notification.SiteUrl;
            using (var ctx = contextHelper.GetAppOnlyContext(uriBuilder.ToString()))
            {
                //Read change token
                var currentChangeToken = await TablesHelper.GetChangeTokenForListAsync(notification.Resource);
                if(currentChangeToken == null)
                {
                    log.Error($"No change token found for list {notification.Resource}. This is a NO GO. Please use the '/api/Setup' function.");
                }
                var listId = Guid.Parse(notification.Resource);
                var changes = await CSOMHelper.GetListItemChangesAsync(ctx, listId, currentChangeToken.ChangeToken);
                if(changes.Count > 0)
                {
                    var lastChange = changes[changes.Count - 1];
                    //Save the last change token
                    var changeTokenValue = lastChange.ChangeToken.StringValue;
                    await TablesHelper.SaveChangeTokenForListAsync(new ListChangeToken(
                            notification.Resource,
                            changeTokenValue
                        ));
                    await HandleChanges(ctx, changes);
                }
            }
        }
        log.Info($"C# Queue trigger function processed: {myQueueItem}");
    }

问题是,当使用“GetChangeTokenForListAsync”时,实体总是被正确接收,但 .ChangeToken 属性总是为空。使用 Azure 存储资源管理器浏览时也不可见。我在这里做错了什么?

【问题讨论】:

  • 你能贴出调用TablesHelper 类的代码吗?
  • 按要求更新了代码:)
  • changeTokenValue 中会有什么样的值。我已经用一个简单的值d 进行了尝试,它可以正常工作,所以TablesHelperListChangeToken 中的代码很好。
  • 也许它与 AzureStorage 模拟器有关?它是一个字符串,表示 SharePoint 列表中的更改标记。这是可以构造的方式: string.Format("1;3;{0};{1};-1", list.Id.ToString(), DateTime.Now.AddDays(-2).ToUniversalTime( ).Ticks.ToString());
  • 是的,就是这样。它已在使用“实时”Azure 时保存。

标签: azure azure-storage


【解决方案1】:

此问题与 Azure 存储模拟器 (V. 5.7.0.0) 有关。使用“实时”Azure 时,相同的代码也能完美运行。

【讨论】:

    猜你喜欢
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    相关资源
    最近更新 更多