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 просто не поддерживает IDialogs, которые делают что-то и немедленно прекратить без 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);
Другие вопросы по тегам