Botframework 将BotState替换为保存用户数据的自定义实现

Botframework 将BotState替换为保存用户数据的自定义实现,botframework,azure-bot-service,Botframework,Azure Bot Service,以前,我使用StateClient对象保存UserData,但由于这将被弃用,因此我实现了一个将ConversationData保存在私有数据库中的解决方案。用户数据是使用以下凭据在对话框上下文之外设置的:` var botCred = new MicrosoftAppCredentials( BotConfiguration.Cfg.MicrosoftAppId, BotConfiguration.Cfg.Micr

以前,我使用StateClient对象保存UserData,但由于这将被弃用,因此我实现了一个将ConversationData保存在私有数据库中的解决方案。用户数据是使用以下凭据在对话框上下文之外设置的:`

var botCred = new MicrosoftAppCredentials(
                    BotConfiguration.Cfg.MicrosoftAppId,
                    BotConfiguration.Cfg.MicrosoftAppPassword);
                var stateClient = new StateClient(botCred);
                BotState botState = new BotState(stateClient);
                BotData botData = new BotData(eTag: "*");
                botData.SetProperty<string>("LastName", lastName);
                botData.SetProperty<string>("FirstName", firstName);
                stateClient.BotState.SetUserData("webchat", userId, botData);
问题是这是在外部控制器中完成的

除了使用自定义数据库进行存储外,如何实现相同的结果


谢谢你

我想你是在问当你不能访问上下文对象时如何读/写状态数据。在这种情况下,您将使用类似以下代码的代码:

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
    if (activity.Type == ActivityTypes.Message)
    {

            var message = activity as IMessageActivity;
            using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
            {
                var botDataStore = scope.Resolve<IBotDataStore<BotData>>();
                var key = Address.FromActivity(message);

                ConversationReference r = new ConversationReference();
                var userData = await botDataStore.LoadAsync(key, BotStoreType.BotUserData, CancellationToken.None);

                userData.SetProperty("key 1", "value1");
                userData.SetProperty("key 2", "value2");

                await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);
                await botDataStore.FlushAsync(key, CancellationToken.None);
            }
            await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
    }
}

我没有访问活动对象的权限,当我想保存该数据时,我在一个外部控制器中。我要做的是在首次调用messagesController之前将索赔主体的索赔保存到bot用户数据。为什么不能在messages controller中执行此操作?因为我使用的是一个通信通道,我正在其中执行身份验证。对于messagesController,我正在使用[botauthenticator]属性,该属性对bot进行身份验证,这里我没有之前的声明,来自通信通道。因此,您完全在bot之外而不是在bot的聊天对话框中处理身份验证?是的,确实,在bot中,我没有登录用户的声明。