Как получить соединение cosmosDB или storageAccount в DebugActivityLogger бот-фреймворка C#

Я хочу сохранить историю разговоров в Azure Cosmos DB или в хранилище учетных записей.

  1. О Azure Cosmos DB

Кажется, действительно легко использовать IActivityLogger. Но я не знаю, как мне получить соединение с БД, которое подключено в Global.asax.cs. Или лучше получить его снова в IActivityLogger?

  1. О хранилище счета

В соответствии с этим SDK также предоставляет способ сохранения истории разговоров с помощью storageAccount. Но активность была сжата. Я хочу сохранить свой настоящий разговор [JSON], который не сжат, в storageAccount.

Я пытаюсь вставить строку в хранилище таблиц Azure со сжатыми данными. Но Activity0 всегда нулевая.

public class ActivityEntity : TableEntity
    {
        /// <summary>
        /// Empty constructor.
        /// </summary>
        public ActivityEntity()
        { }

        /// <summary>
        /// Construct from an IActivity.
        /// </summary>
        /// <param name="activity"></param>
        public ActivityEntity(byte[] Activity)
        {
            PartitionKey = "111";
            RowKey = "11";
            From = "111";
            Recipient = "111";
            Activity0 = Activity;
            Version = 3.0;
        }

        /// <summary>
        /// Version number for the underlying activity.
        /// </summary>
        public double Version { get; set; }

        /// <summary>
        /// Channel identifier for sender.
        /// </summary>
        public string From { get; set; }

        /// <summary>
        /// Channel identifier for receiver.
        /// </summary>
        public string Recipient { get; set; }

        /// <summary>
        /// Logged activity.
        /// </summary>
        [IgnoreProperty]
        public byte[] Activity0 { get; set; }

        /// <summary>
        /// Generate a partition key given <paramref name="channelId"/> and <paramref name="conversationId"/>.
        /// </summary>
        /// <param name="channelId">Channel where activity happened.</param>
        /// <param name="conversationId">Conversation where activity happened.</param>
        /// <returns>Partition key.</returns>
        public static string GeneratePartitionKey(string channelId, string conversationId)
        {
            return $"{channelId}|{conversationId}";
        }

        /// <summary>
        /// Generate row key for ascending <paramref name="timestamp"/>.
        /// </summary>
        /// <param name="timestamp">Timestamp of activity.</param>
        /// <returns></returns>
        public static string GenerateRowKey(DateTime timestamp)
        {
            return $"{timestamp.Ticks:D19}";
        }

    }




     class Program
    {
        public static object CloudConfigurationManager { get; private set; }

        static void Main(string[] args)
        {

            CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=storagetesthuafu;AccountKey=iQ0EZexm3wbpWZqly2HtVH0/CZKRyMY9l2b0g20AQkUz7BX0BFLuBinMyYLe8Ow/zOA7vJqAMSxSHllT3JTL2g==;EndpointSuffix=core.windows.net");

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

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



            TableQuery<BotDataRow> query = new TableQuery<BotDataRow>();
            var data = table.ExecuteQuery(query);
            var dataarry = data.ToArray();


            var aa = dataarry.First();
            var activity = aa.Activity0;
            var after = Decompress(activity);


            CloudTable tableTEST = tableClient.GetTableReference("messagelog");


            byte[] bb = Encoding.UTF8.GetBytes(after);
            ActivityEntity customer4 = new ActivityEntity(bb);

            // Create the InsertOrReplace TableOperation.
            TableOperation insertOrReplaceOperation = TableOperation.InsertOrReplace(customer4);

            // added to the table.
            table.Execute(insertOrReplaceOperation);
        }

1 ответ

Решение

Создание реализации IActivityLogger, которая использует DocumentDb, не требует большого количества кода. Вот пример использования эмулятора Azure Cosmos DB:

class DocumentDbActivityLogger : IActivityLogger
{
    const string DbKey = "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==";
    const string DbUri = "https://localhost:8081";
    const string DbId = "ActivityLogsDb";
    const string CollectionId = "ActivityLogsColleciton";

    async Task IActivityLogger.LogAsync(IActivity activity)
    {
        try
        {
            var message = activity.AsMessageActivity();
            if (message != null)
            {
                using (var documentClient = new DocumentClient(new Uri(DbUri), DbKey))
                {
                    await documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DbId, CollectionId), message);
                }
            }
        }
        catch (Exception e)
        {
            System.Diagnostics.Debug.Print(e.ToString());
        }
    }
}

Затем зарегистрируйте его в Global.asax.cs:

Conversation.UpdateContainer(builder =>
{
     builder.RegisterType<DocumentDbActivityLogger>().AsImplementedInterfaces().InstancePerDependency();
}

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