首页 > 解决方案 > 在 Microsoft Bot 中存储用户状态数据

问题描述

  public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));

        if (activity.Type == ActivityTypes.Message)
        {
            Activity isTypingReply = activity.CreateReply();
            isTypingReply.Type = ActivityTypes.Typing;
            await connector.Conversations.ReplyToActivityAsync(isTypingReply);
            StateClient sc = activity.GetStateClient();
            BotData userData = await sc.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id); // have to check on monday

            if (!userData.GetProperty<bool>("ChannelUserData"))
            { // fetch user details    

上面来自 MS Bot SDK 1.x 应用程序的片段,用于更新状态中的用户数据。现在我正在尝试将旧机器人应用程序升级到 Microsoft Bot SDK 3.x。我正在使用 Cosmos Db 来存储状态值。

如何使用 channelId 和 From Id 存储或更新用户数据?获取用户详细信息后,我将其更新为
await sc.BotState.SetUserDataAsync(activity.ChannelId, activity.From.Id, userData);

一年后,我重新打开了 Microsoft 应用程序并对其进行了很多更改。所以,我无法获取正确的文档。有人可以帮助/指导我使用 Cosmos DB 的状态存储过程吗?

遵循基本设置https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-state-azure-cosmosdb?view=azure-bot-service-3.0

标签: c#azurebotframeworkazure-cosmosdb

解决方案


小心:activity.GetStateClient();正在返回已弃用的旧 StateClient。

要使用 CosmosDb,请遵循您提到的文档 ( https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-state-azure-cosmosdb?view=azure-bot -service-3.0#modify-your-bot-code ) 将 CosmosDb 注册为IBotDataStore<BotData>

然后当你想使用它时,例如获取一个属性:

using (ILifetimeScope scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))
{
    var address = Address.FromActivity(activity);
    IBotDataStore<BotData> botDataStore = scope.Resolve<IBotDataStore<BotData>>();
    BotData botData = await botDataStore.LoadAsync(address, destination, CancellationToken.None);
    return botData.GetProperty<T>(propertyName);
}

这里的方法Address.FromActivity(activity);是自动获取正确的键来指向正确的项目。


推荐阅读