Хранилище таблиц Azure не сохраняет все свойства объекта - PullRequest
0 голосов
/ 13 февраля 2019

У меня проблема с хранилищем таблиц Azure.Я пытаюсь добиться сохранения ChangeToken в списке SharePoint для правильного использования веб-хуков.

Вот код:

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», Entity принимается правильно, но свойство .ChangeToken всегда равно null,Он также не отображается при просмотре с помощью обозревателя хранилищ Azure.Что я здесь не так делаю?

1 Ответ

0 голосов
/ 13 февраля 2019

Проблема связана с эмулятором хранилища Azure (V. 5.7.0.0).Тот же код отлично работает при работе с «живым» Azure.

...