Как получить соединение cosmosDB или storageAccount в DebugActivityLogger бот-фреймворка C#
Я хочу сохранить историю разговоров в Azure Cosmos DB или в хранилище учетных записей.
- О Azure Cosmos DB
Кажется, действительно легко использовать IActivityLogger. Но я не знаю, как мне получить соединение с БД, которое подключено в Global.asax.cs. Или лучше получить его снова в IActivityLogger?
- О хранилище счета
В соответствии с этим 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();
}