MS Bot Frameworkを使用している私のボットが、facebook
とemulator
の両方のチャネルで無限ループでメッセージを送信していました。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);
}
要約すると
子どものダイアログが何らかの形でユーザーの初期メッセージを会話に返すということは、同じダイアログを何度も繰り返すことです。しかし、これは起こらないはずです。子供IDialog
は私が作成したHeroCard
を除いて、会話に何も送ってはいけません。
私は間違った方向を見ていて、ボットフレームワークはをサポートしておらず、何かをしてただちにcontext.Wait()
なしで終了しますか?
からダイアログを呼び出しますので、これは可能である
を使用することを発見しましたMessageReceivedAsync型のメソッドに?あなたはcontext.Forwardをやっているので、StartAsyncにロジックを置く必要はありません。 –
@EzequielJadib 'StartAsync()'は何もしないでください。別のメソッドを呼び出す必要がある場合は、 'context.Wait()'を実行する必要があると仮定します。これは、ユーザからの入力をもう1つ待つことを意味します。 – K48
あなたはcontext.Wait()を行う必要がありますが、あなたが文脈をやっているなら、あなたはユーザー入力を待つことはありません。メッセージは通過します。私に知らせて、私は答えを投稿します –