如何在消息控制器之类的对话框外访问Bot Framework ConversationData?

Sam*_*ley 4 c# botframework

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

context.ConversationData.SetValue("SomeFlag", true);
Run Code Online (Sandbox Code Playgroud)

稍后,将消息分派到对话框之前,我需要在MessagesController中检查该标志。根据上一个问题,我尝试通过StateClient检索ConversationData,如下所示:

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
}
Run Code Online (Sandbox Code Playgroud)

但是,在运行时,该userData变量持有一个BotData对象,该对象userData.Data为null,并且我无法通过检索任何存储的标志GetProperty。我在相关文档中看不到任何有助于阐明此问题的信息-我在这里可能做错了什么?我有误会吗?

D4R*_*IDE 5

以下应该可以满足您的需求:

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());
}
Run Code Online (Sandbox Code Playgroud)