我們正試圖挽救一個簡單的序列化對象PrivateConversationData的Dialog,并從國家訪問中MessagesController出于某種原因,在我們Context.Done在對話框中執行之后,我們沒有取回存儲在狀態中的數據 public static async Task SetUserAsync<T>(IActivity activity, T botUser) where T : IBotUser { if (botUser != null) { using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity.AsMessageActivity())) { var botDataStore = scope.Resolve<IBotDataStore<BotData>>(); var key = new AddressKey() { BotId = activity.Recipient.Id, ChannelId = activity.ChannelId, UserId = activity.From.Id, ConversationId = activity.Conversation.Id, ServiceUrl = activity.ServiceUrl }; var privateData = await botDataStore.LoadAsync(key, BotStoreType.BotPrivateConversationData, CancellationToken.None); privateData.SetProperty<T>(Keys.CacheBotUserKey, botUser); await botDataStore.SaveAsync(key, BotStoreType.BotPrivateConversationData, privateData, CancellationToken.None); await botDataStore.FlushAsync(key, CancellationToken.None); } } }對話框代碼很簡單 public override async Task ProcessMessageAsync(IDialogContext context, IAwaitable<IMessageActivity> result) { BotUser user = new BotUser { UserId = "user1" }; await StateHelper.SetUserAsync(context.Activity, user); var userFromState = await StateHelper.GetUserAsync<BotUser>(context.Activity); Debug.WriteLine("Within dialog (after set) >" + userFromState?.UserId); context.Done<object>(null); }在這種情況下,我們得到以下輸出Within dialog (after set) > user1 Within MC (end) >有什么問題嗎?
1 回答

手掌心
TA貢獻1942條經驗 獲得超3個贊
當對話框加載時,狀態會隨之加載,并且可以使用 Context 對象上的方法訪問/保存。當對話完成時,狀態由 SDK 持久化。如果您創建一個嵌套在對話框中的新范圍,并嘗試加載/保持狀態:那么對話框狀態將覆蓋它。要解決此問題,您可以在 StateHelper 中添加一個接受IDialogContext 的方法,并在 Dialog 中使用該方法。
- 1 回答
- 0 關注
- 193 瀏覽
添加回答
舉報
0/150
提交
取消