2016-12-01 7 views
1

MS Bot Frameworkを使用している私のボットが、facebookemulatorの両方のチャネルで無限ループでメッセージを送信していました。MS Bot Frameworkが無限ループでメッセージを送信しようとしました

私のボットには、メニューのような種類の「ルート」IDialogがあり、ユーザの選択に応じていくつかのIDialogが呼び出されます。子ダイアログは、このように呼ばれています。

 ... 
     else if (response.Text == MainOptions[2]) 
     { 
      await context.Forward(new InfoCounterDialog(), ChildDialogComplete, 
            response, CancellationToken.None); 
     } 
     ... 
  • responseは、ユーザーが送信IMessageActivityです。

  • ChildDialogComplete再びメインメニューを構築し、これらの行で終わる方法です。

    await context.PostAsync(restartPrompt); 
    context.Wait(MainScreenSelectionReceived); 
    

    すべてのダイアログには、無限ループが発生し、この1つの非常に短いダイアログ、除いて正常に動作 - ボットは、私は、Webアプリケーションを停止するまで何度も何度もこのメッセージを送信し続けます。

    namespace XXXX 
    { 
    [Serializable] 
    public class InfoCounterDialog : IDialog 
    { 
        public async Task StartAsync(IDialogContext context) 
        { 
         var hourNow = DateTime.Now.Hour; 
         var openNow = ""; 
         if (hourNow >= 7) 
         { 
          openNow = "It is open now and will close at midnight."; 
         } 
         else 
         { 
          openNow = "It is closed now and will open at 7:00"; 
         } 
         var card = HeroCardUtils.CardWithImageAndMiscButtons(
          "Our information counter can help!", 
          "It's located in Shop 081, Level 3 in Building 2. " + openNow, 
          "http://www.[image URL here].jpg", 
          new[] { "More Details" }, 
          new[] { ActionTypes.OpenUrl }, 
          new[] { "[webpage URL here]" } 
          ); 
         await BotUtils.SendCardToChat(context, card); 
         context.Done(this); 
        } 
    } 
    

    }

    あなたはSendCardToChatが何をするか迷っている場合:私は別のダイアログからダイアログを起動してい

    • context.Forward()
    • を使用して:

      public async static Task SendCardToChat(IDialogContext context, HeroCard card) 
          { 
           var activity = context.MakeMessage(); 
           activity.Attachments = HeroCardUtils.CardToAttachments(card); 
           await context.PostAsync(activity); 
          } 
      

      要約すると

    • ダイアログはsuppですユーザにメッセージを表示して、ユーザからの特別な入力なしでただちに終了してください。
    • 代わりに、私たちの情報カウンターが助けてくれるを送信し続けます。メッセージは無限に送信されます。

    子どものダイアログが何らかの形でユーザーの初期メッセージを会話に返すということは、同じダイアログを何度も繰り返すことです。しかし、これは起こらないはずです。子供IDialogは私が作成したHeroCardを除いて、会話に何も送ってはいけません。

    私は間違った方向を見ていて、ボットフレームワークはをサポートしておらず、何かをしてただちにcontext.Wait()なしで終了しますか?

  • +0

    からダイアログを呼び出しますので、これは可能である

    // within a HotelsDialog.cs context.Done<object>(null); 

    を使用することを発見しましたMessageReceivedAsync型のメソッドに?あなたはcontext.Forwardをやっているので、StartAsyncにロジックを置く必要はありません。 –

    +0

    @EzequielJadib 'StartAsync()'は何もしないでください。別のメソッドを呼び出す必要がある場合は、 'context.Wait()'を実行する必要があると仮定します。これは、ユーザからの入力をもう1つ待つことを意味します。 – K48

    +0

    あなたはcontext.Wait()を行う必要がありますが、あなたが文脈をやっているなら、あなたはユーザー入力を待つことはありません。メッセージは通過します。私に知らせて、私は答えを投稿します –

    答えて

    1

    私はcontext.Done(R値)に関する文書はあまりありませんが、ダイアログの流れを制御する上で本当に重要であることがわかりました。

    私はそのコンテキストを推測しています。これはあなたのDialogを再び呼び出しますか?あなたは、私はそれがイライラ完成したダイアログを伝えるためにcontext.Done()メソッド(パラメータなし)が存在しないことを発見してい

    context.Done(true); 
    

    を試してみました。これにさらに

    は、私は this Microsoft Exampleに、彼らはuがStartAsyncからロジックを移動しようとしている彼らは root dialog

    // within RootDialog.cs 
    context.Call(new HotelsDialog(), this.ResumeAfterOptionDialog); 
    
    +0

    私は何か他の方法で問題を解決しましたが、私はどのように覚えていません。私はcontext.Done(this)を他のプロジェクトでもうまく使っています。私はこれが私たちが終了しているIDialogオブジェクトだと仮定します。 – K48

    +0

    これに加えて、私はcontext.Doneを使い始めました(null);このmsサンプルクラスのfinallyステートメントと同様です。https://github.com/Microsoft/BotBuilder-Samples/blob/master/CSharp/core-MultiDialogs/Dialogs/HotelsDialog.cs – chris31389

    関連する問題