Как получить сохраненные данные разговора в Azure (Tablelogger)

Я был в состоянии сохранить данные разговора, используя реализацию Tablelogger.cs TableLogger.cs

Я следовал этому руководству, чтобы сохранить историю разговоров. Запись истории разговоров

Код, который я использовал для сохранения истории чата:

 var tableName = ConfigurationManager.AppSettings["TableName"].ToString();
 var account = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString);

 Conversation.UpdateContainer(
            builder =>
            {
                account.CreateCloudTableClient().GetTableReference(tableName).DeleteIfExists();
                builder.RegisterModule(new TableLoggerModule(account, tableName));
            });

После проверки проводника хранилища таблиц Azure я могу подтвердить, что информация была сохранена.

введите описание изображения здесь

Теперь у меня вопрос, как извлечь данные разговора и вернуть их в виде строки, чтобы я мог отправить их агенту для проверки?

1 ответ

Решение

Все ваши разговорные сообщения (скажем, сообщения, а не данные, так как данные разговора - это другая вещь в словаре Bot Framework, речь идет о состоянии), хранятся в таблице Azure, поэтому, если вы хотите получить эти сообщения, вам просто нужно запросить таблицу,

Получение элементов таблицы

У вас есть несколько вариантов запроса таблицы, например

Пример из документа, чтобы получить все строки по разделам:

// Retrieve the storage account from the connection string.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    CloudConfigurationManager.GetSetting("StorageConnectionString"));

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

// Create the CloudTable object that represents the "people" table.
CloudTable table = tableClient.GetTableReference("people");

// Construct the query operation for all customer entities where PartitionKey="Smith".
TableQuery<CustomerEntity> query = new TableQuery<CustomerEntity>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "Smith"));

// Print the fields for each customer.
foreach (CustomerEntity entity in table.ExecuteQuery(query))
{
    Console.WriteLine("{0}, {1}\t{2}\t{3}", entity.PartitionKey, entity.RowKey,
        entity.Email, entity.PhoneNumber);
}

Документация для выполнения более индивидуального запроса, который будет соответствовать вашим потребностям: https://docs.microsoft.com/en-us/azure/cosmos-db/table-storage-how-to-use-dotnet

Организация данных

В вашем захвате вы можете увидеть, что PartitionKey таблицы сделаны из конкатенации вашего channel и то, что похоже на разговор. Это подтверждается источниками TableLogger здесь:

/// <summary>
/// Construct from an IActivity.
/// </summary>
/// <param name="activity"></param>
public ActivityEntity(IActivity activity)
{
    PartitionKey = GeneratePartitionKey(activity.ChannelId, activity.Conversation.Id);
    RowKey = GenerateRowKey(activity.Timestamp.Value);
    From = activity.From.Id;
    Recipient = activity.Recipient.Id;
    Activity = activity;
    Version = 3.0;
}

Поэтому вам, вероятно, будет интересно получить все строки для данного ключа ключа.

Для других полей: RowKey это метка времени, и Activity отображается на ваш бот Activity объект, так что это объект, который содержит несколько сведений. Вы должны будете сделать некоторые JsonConvert.DeserializeObject<Activity> чтобы получить интересную информацию.

Другие вопросы по тегам