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

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

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

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

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

但是,在运行时, userData变量包含一个BotData对象,其中userData.Data为null,并且我无法通过GetProperty检索任何存储的标志。 我没有在相关文档中看到任何有助于阐明这个问题的内容 – 我可能在这里做错了什么? 有什么我误解的吗?

以下内容适合您的需求:

 if (activity.Type == ActivityTypes.Message) { var message = activity as IMessageActivity; using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message)) { var botDataStore = scope.Resolve>(); 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("key 1"); userData.GetProperty("key 2"); await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None); await botDataStore.FlushAsync(key, CancellationToken.None); } await Conversation.SendAsync(activity, () => new Dialogs.RootDialog()); } 

使用StateClient初始化BotState对象,如下所示。 请尝试以下代码

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