問題陳述:當自定義事件發送到機器人時,我想從 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 中獲取上下文引用的推薦方法。在此處尋找有關如何設置代碼的建議。在我的基本場景中,當我一次發送一個消息,一次發送一個事件而無需等待時,它似乎工作正常。但是通過復雜的對話框,我得到“對不起,我的機器人代碼有錯誤”。
1 回答

FFIVE
TA貢獻1797條經驗 獲得超6個贊
您的問題似乎是基于MakeRoot
對Conversation.SendAsync
. 委托不能用于控制將活動發送到哪個對話框。您必須傳遞一個委托而不只是一個對話框的原因是因為在大多數情況下不應該構造新的對話框。背后的想法Conversation.SendAsync
是將活動發送到堆棧頂部的任何對話框。從文檔中:
MakeRoot
工廠方法僅對新對話調用,因為現有對話在數據中具有對話堆棧和狀態序列化IMessageActivity
。
雖然我不知道您嘗試做什么的詳細信息,但我認為您應該能夠以不需要使用對話框的方式響應大多數事件。如果您確定要將這些事件發送到對話框,則需要記住只有一個對話框堆棧并且堆棧頂部只有一個對話框,這意味著您需要確保所有對話框能夠優雅地處理所有可能的事件。請查看文檔以更好地理解對話和對話流程:https ://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-manage-conversation-flow?view =azure-bot-service-3.0
- 1 回答
- 0 關注
- 154 瀏覽
添加回答
舉報
0/150
提交
取消