MS Bot Framework застрял при отправке сообщений в бесконечном цикле
Мой бот, использующий MS Bot Framework, застрял, отправляя сообщения пользователю в бесконечном цикле, как на facebook
а также emulator
каналы.
У моего бота есть "рут" 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);
Все диалоги работают нормально, кроме этого очень короткого диалога, который вызывает бесконечный цикл - бот продолжает отправлять это сообщение снова и снова, пока я не остановлю веб-приложение.
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
делает:
public async static Task SendCardToChat(IDialogContext context, HeroCard card)
{
var activity = context.MakeMessage();
activity.Attachments = HeroCardUtils.CardToAttachments(card);
await context.PostAsync(activity);
}
Подведем итог:
- Я запускаю диалог из другого диалога, используя
context.Forward()
- Предполагается, что диалоговое окно отображает сообщение для пользователя и немедленно завершается без дополнительного ввода данных пользователем.
- Вместо этого он продолжает посылать "Наш счетчик информации может помочь!" сообщение бесконечно.
Мое лучшее предположение состоит в том, что дочерний диалог каким-то образом возвращает исходное сообщение пользователя в диалог, который вызывает тот же диалог снова и снова. Но этого не должно случиться, ребенок IDialog
не должен ничего отправлять в разговор, кроме HeroCard
Я создал.
Или, может быть, я смотрю в неправильном направлении, а Bot Framework просто не поддерживает IDialog
s, которые делают что-то и немедленно прекратить без context.Wait()
?
1 ответ
Я обнаружил, что не так много документации по context.one(значение R), но это действительно важно для управления потоком диалога.
Я предполагаю, что контекст. Кто-то (это) снова вызывает ваш диалог? ты пытался
context.Done(true);
Я нахожу это разочаровывающим, что нет метода context.Done() (без параметров), чтобы сообщить диалогу, что вы закончили.
В дополнение к этому, я обнаружил, что в этом примере Microsoft они используют
// within a HotelsDialog.cs
context.Done<object>(null);
Это возможно, потому что они вызывают диалог из корневого диалога
// within RootDialog.cs
context.Call(new HotelsDialog(), this.ResumeAfterOptionDialog);