如何在 MessageController 中为自定义事件调用自定义对话框

问题陈述:

当自定义事件发送到机器人时,我想从 MessageController 调用对话框。


设置:

我有一个使用 Microsoft Bot Framework [v3.15.3] 构建的机器人

我有一组自定义事件,这些事件从外部系统发送到机器人,以通知机器人并要求它执行操作。

[例如,MarkUserAsOfflineInBackEndStore ShowExternalActionCompletedMessageToUser]


我的用户使用具有网络聊天连接的门户网站连接到机器人。这还会向机器人发送自定义事件,以通知机器人有关用户操作

[示例UserClickedOnLogoutFromSite,userNavigatedToDifferentPage]


对于这些事件,机器人也必须采取一些行动。


问题陈述:

从我的消息控制器,我必须根据传入的不同事件重定向到不同的对话框。我当前的设置如下:


 using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity))

 {

     if (activity.Type == ActivityTypes.Event)

     {

         var eventDialog = GetEventDialog(scope, activity);

         if (eventDialog != null)

         {

              await Conversation.SendAsync(activity, () => eventDialog).ConfigureAwait(false);

         }

     }

     else

     {

          await Conversation.SendAsync(activity, () => scope.Resolve<RootDialog>()).ConfigureAwait(false);

     }

}

我希望用户能够与机器人交谈而不会出错,而不管正在发生的事件如何。这意味着如果机器人正在等待使用context.Wait(...)事件的用户输入,则不应导致意外行为。


我探索了使用调用对话框,context.Call但找不到在 messagecontroller 中获取上下文引用的推荐方法。


在此处寻找有关如何设置代码的建议。在我的基本场景中,当我一次发送一个消息,一次发送一个事件而无需等待时,它似乎工作正常。但是通过复杂的对话框,我得到“对不起,我的机器人代码有错误”。


MM们
浏览 134回答 1
1回答

FFIVE

您的问题似乎是基于MakeRoot对Conversation.SendAsync.&nbsp;委托不能用于控制将活动发送到哪个对话框。您必须传递一个委托而不只是一个对话框的原因是因为在大多数情况下不应该构造新的对话框。背后的想法Conversation.SendAsync是将活动发送到堆栈顶部的任何对话框。从文档中:MakeRoot工厂方法仅对新对话调用,因为现有对话在数据中具有对话堆栈和状态序列化IMessageActivity。虽然我不知道您尝试做什么的详细信息,但我认为您应该能够以不需要使用对话框的方式响应大多数事件。如果您确定要将这些事件发送到对话框,则需要记住只有一个对话框堆栈并且堆栈顶部只有一个对话框,这意味着您需要确保所有对话框能够优雅地处理所有可能的事件。请查看文档以更好地理解对话和对话流程:https ://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-manage-conversation-flow?view&nbsp;=azure-bot-service-3.0
打开App,查看更多内容
随时随地看视频慕课网APP