代码之家  ›  专栏  ›  技术社区  ›  Sam Hanley

我如何在像messages controller这样的对话框之外访问Bot Framework ConversationData?

  •  5
  • Sam Hanley  · 技术社区  · 8 年前

    在我的机器人内的一个对话框中,我在ConversationData中存储了一个标志值,如下所示:

    context.ConversationData.SetValue("SomeFlag", true);
    

    稍后,我需要检查MessagesController中的标志, 之前 this previous question

    public async Task<HttpResponseMessage> Post([FromBody] Activity incomingMessage)
    {
        StateClient stateClient = incomingMessage.GetStateClient();
        BotData userData = await stateClient.BotState.GetConversationDataAsync(message.ChannelId, message.Conversation.Id);
        bool finishedQuote = userData.GetProperty<bool>("SomeFlag");
        //...
        // do conditional logic, then dispatch to a dialog as normal
    }
    

    然而,在运行时 userData userData.Data 为null,我无法通过 GetProperty . 我什么都没看到 relevant documentation

    2 回复  |  直到 8 年前
        1
  •  6
  •   D4RKCIDE    8 年前

    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);
    
            //you can get/set UserData, ConversationData, or PrivateConversationData like below
            //set state data
            userData.SetProperty("key 1", "value1");
            userData.SetProperty("key 2", "value2");
            //get state data
            userData.GetProperty<string>("key 1");
            userData.GetProperty<string>("key 2");
    
            await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None);
            await botDataStore.FlushAsync(key, CancellationToken.None);
        }
        await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
    }
    
        2
  •  -1
  •   Satheesh    8 年前

       public static T GetStateData<T>(Activity activity, string key)
        {
            BotState botState = new BotState(activity.GetStateClient());
            BotData botData = botState.GetConversationData(activity.ChannelId, activity.Conversation.Id);
            return botData.GetProperty<T>(key);
        }