Bot Builder SDK 提供了 兩個非常好用的方法讓我們自由操作對話的流程
Call 可以讓我們叫起一個Dialog 來處理對話(不傳訊息)
Forward 則是除了叫起來之外還可以傳訊息給Child Dialog
而當我們使用Forward 的時候需要注意傳遞訊息的型態
如果遇到底下的錯誤訊息
Exception: invalid need: expected Wait, have Call表示爸爸dialog傳遞的訊息跟孩子期待的不一致
以下就是個錯誤範例,
爸爸Dialog
[LuisIntent("FindTool")]public async Task FindTool(IDialogContext context, LuisResult result) { //.... string toolName=... await context.Forward( new SearchToolDialog(), null, toolName, System.Threading.CancellationToken.None); } |
public virtual async Task MessageReceivedAsync(IDialogContext context,IAwaitable<IMessageActivity> argument) { var message = await argument; //....} |
因為孩子等不到IMessageActivity 型態的物件
所以執行到var message = await argument時
就會拋出Exception
解決方法:
修改爸爸Dialog, 讓爸爸傳IMessageActivity 的物件給孩子
方法一:
修改方法簽章, 傳入IMessageActivity
[LuisIntent("FindTool")]public async Task FindTool(IDialogContext context, IAwaitable<IMessageActivity> activity, LuisResult result) { //.... var message= await activity; await context.Forward( new SearchToolDialog(), null, message, System.Threading.CancellationToken.None);} |
方法二:
呼叫 MakeMessage() 自己做一個 IMessageActivity
[LuisIntent("FindTool")]public async Task FindTool(IDialogContext context,LuisResult result) { //.... EntityRecommendation toolNameEntityRecommendation; if (result.TryFindEntity("toolName", out toolNameEntityRecommendation)){} var message= context.MakeMessage(); message.Text=toolNameEntityRecommendation.Entity; await context.Forward( new SearchToolDialog(), null, message, System.Threading.CancellationToken.None); } |
留言
張貼留言