Когда вы завершаете поддиалог в Microsoft Bot Framework V4, как вы продолжаете в родительском диалоге? - PullRequest
0 голосов
/ 22 февраля 2019

Введение

В настоящее время я пытаюсь создать приложение Bot Framework с использованием Microsoft Bot Framework v4.

Структура программы

В настоящее время мы имеем следующую настройку:

Корень класса бота называется: SubDialogBotBot

В SubDialogBot мы создаем новый диалог с именем ParentDialog,Этот диалог отвечает за реакцию на конкретное намерение.

Затем мы запускаем новый диалог с ParentDialog с именем ChildDialog.Этот дочерний диалог будет отвечать за задание пользователю вопроса на основе аргументов, переданных ParentDialog.

После завершения этого вопроса мы хотим вернуться к ParentDialog и продолжить поток.

В этом примере мы хотим повторно использовать ChildDialog из всех видов различных намерений, поскольку код здесь точно такой же.Единственное, что меняется, это вопросы, которые нужно задать пользователю.

Проблема

Когда ChildDialog завершает, «поток» никогда не возвращаетсяParentDialog.

Мы также пытались настроить диалог, следующий за идентификатором ChildDialog, на какое-то конкретное значение, а затем вызвать его с помощью Context.BeginDialog (....) из ChildDialog.Однако, поскольку, по-видимому, диалог был добавлен к ParentDialog, а не к ChildDialog, он не может найти его по идентификатору.

Репозиторий Github, воспроизводящий проблему

https://github.com/devedse/SubDialogBotReproduction

1 Ответ

0 голосов
/ 22 февраля 2019

Во-первых, это удивительно подготовленный вопрос, спасибо ... особенно за то, что поделились кодом.

Теперь, хорошая новость - я не думаю, что вижу какие-либо проблемы с вашими диалогами.Проблема на самом деле в вашего бота OnTurnAsync.Вы звоните BeginDialogAsync только на свой ParentDialog.Каждое отдельное действие будет проходить через ваш OnTurnAsync, и это означает, что вы несете ответственность за обработку повторного входа в стек диалога.Это означает, что вам нужно проверить наличие активного диалога, и, если он есть, вам нужно позвонить ContinueDialogAsync вместо того, чтобы продолжить с того места, где остановилось обсуждение.Вот ваш текущий OnTurnAsync с добавленными дополнительными проверками:

public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
    // Create a dialog context
    var dc = await Dialogs.CreateContextAsync(turnContext);

    // Handle Message activity type, which is the main activity type for shown within a conversational interface

    // Message activities may contain text, speech, interactive cards, and binary or unknown attachments.

    // see https://aka.ms/about-bot-activity-message to learn more about the message and other activity types

    if (turnContext.Activity.Type == ActivityTypes.Message)
    {
        // If there's no active dialog, begin the parent dialog
        if(dc.ActivDialog == null)
        {
           await dc.BeginDialogAsync(nameof(ParentDialog));
        }
        else
        {
           await dc.ContinueDialogAsync();
        }


        // Save the new turn count into the conversation state.
        await _accessors.ConversationState.SaveChangesAsync(turnContext);
    }
    else
    {

        await turnContext.SendActivityAsync($"{turnContext.Activity.Type} event detected");
    }
}
...