Comment puis-je accéder à Bot Framework ConversationData en dehors d’une boîte de dialog, comme dans le contrôleur de messages?

Dans une boîte de dialog de mon bot, je stocke une valeur d’indicateur dans ConversationData comme ceci:

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

Plus tard, je dois vérifier cet indicateur dans MessagesController avant que le message ne soit envoyé à une boîte de dialog. Selon cette question précédente, j’ai essayé de récupérer ConversationData via StateClient comme ceci:

 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 } 

Toutefois, au moment de l’exécution, la variable userData contient un object BotData où userData.Data null et je ne parviens pas à récupérer les indicateurs stockés via GetProperty . Je ne vois rien dans la documentation pertinente qui aide à éclaircir cette question – qu’est-ce que je peux faire de mal ici? Y a-t-il quelque chose que je comprends mal?

Ce qui suit devrait fonctionner pour ce dont vous avez besoin:

 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()); } 

Initialisez l’object BotState avec StateClient comme ci-dessous. Essayez le code ci-dessous

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