Как получить сохраненные данные разговора в 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, поэтому, если вы хотите получить эти сообщения, вам просто нужно запросить таблицу,
Получение элементов таблицы
У вас есть несколько вариантов запроса таблицы, например
- Клиентская библиотека хранилища Microsoft Azure для.NET: https://www.nuget.org/packages/WindowsAzure.Storage/
Пример из документа, чтобы получить все строки по разделам:
// 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>
чтобы получить интересную информацию.