跳到主要內容

[Bot Framework] Exception: invalid need: expected Wait, have Call









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);

}

孩子Dialog


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);




}







































留言