如何在Waterfall对话框中访问TurnContext里的aad_object_id值
解决Waterfall对话框中访问TurnContext里aad_object_id的问题
有两种常用方法可以实现将TurnContext中的aad_object_id传入Waterfall对话框:
方法一:通过用户/对话状态传递值
这种方式适合需要在多轮对话中持久化该值的场景。
1. 在DialogBot中获取并存储值
修改bots/dialog_bot.py,从TurnContext提取aad_object_id后存入用户状态:
# bots/dialog_bot.py from botbuilder.core import ActivityHandler, TurnContext, UserState, ConversationState from botbuilder.dialogs import Dialog, DialogSet, DialogTurnStatus class DialogBot(ActivityHandler): def __init__(self, conversation_state: ConversationState, user_state: UserState, dialog: Dialog): self.conversation_state = conversation_state self.user_state = user_state self.dialog = dialog self.dialog_state_accessor = self.conversation_state.create_property("DialogState") async def on_message_activity(self, turn_context: TurnContext): # 从TurnContext获取aad_object_id aad_object_id = turn_context.activity.from_property.aad_object_id # 将值存入用户状态 user_profile = await self.user_state.create_property("UserProfile").get(turn_context, {}) user_profile["aad_object_id"] = aad_object_id await self.user_state.save_changes(turn_context) # 处理对话框逻辑 dialog_set = DialogSet(self.dialog_state_accessor) dialog_set.add(self.dialog) dialog_context = await dialog_set.create_context(turn_context) results = await dialog_context.continue_dialog() if results.status == DialogTurnStatus.Empty: await dialog_context.begin_dialog(self.dialog.id) await self.conversation_state.save_changes(turn_context)
2. 在Waterfall对话框中读取值
修改dialog/Waterfall_dialog.py,从用户状态中取出存储的aad_object_id:
# dialog/Waterfall_dialog.py from botbuilder.dialogs import WaterfallDialog, WaterfallStepContext, DialogTurnResult from botbuilder.core import UserState, MessageFactory class MyWaterfallDialog(WaterfallDialog): def __init__(self, dialog_id: str = None, user_state: UserState = None): super().__init__(dialog_id or MyWaterfallDialog.__name__) self.user_state = user_state self.add_step(self._retrieve_aad_id_step) async def _retrieve_aad_id_step(self, step_context: WaterfallStepContext) -> DialogTurnResult: # 从用户状态获取aad_object_id user_profile = await self.user_state.create_property("UserProfile").get(step_context.context, {}) aad_object_id = user_profile.get("aad_object_id") # 使用获取到的ID进行后续逻辑 await step_context.context.send_activity(f"获取到你的AAD Object ID:{aad_object_id}") return await step_context.end_dialog()
方法二:通过DialogOptions直接传递值
如果只需要在当前对话框会话中使用该值,可直接通过启动对话框时的options参数传递:
1. 在DialogBot中传递参数
修改bots/dialog_bot.py的on_message_activity方法:
async def on_message_activity(self, turn_context: TurnContext): aad_object_id = turn_context.activity.from_property.aad_object_id dialog_set = DialogSet(self.dialog_state_accessor) dialog_set.add(self.dialog) dialog_context = await dialog_set.create_context(turn_context) results = await dialog_context.continue_dialog() if results.status == DialogTurnStatus.Empty: # 将aad_object_id作为options参数传入对话框 await dialog_context.begin_dialog(self.dialog.id, options={"aad_object_id": aad_object_id}) await self.conversation_state.save_changes(turn_context)
2. 在Waterfall对话框中读取参数
修改dialog/Waterfall_dialog.py的步骤方法:
async def _retrieve_aad_id_step(self, step_context: WaterfallStepContext) -> DialogTurnResult: # 从options中直接获取传递的aad_object_id aad_object_id = step_context.options.get("aad_object_id") await step_context.context.send_activity(f"获取到你的AAD Object ID:{aad_object_id}") return await step_context.end_dialog()
内容的提问来源于stack exchange,提问作者user3447228
相关产品推荐
相关产品推荐

