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