Bot框架DialogContext.Continue不起作用

时间:2018-08-17 09:55:31

标签: c# botframework

我已经使用Microsoft Bot Builder SDK v-4(预发行版)实现了一个漫游器。为了管理对话流程,我使用了两个简单的对话框-

问候对话框-对话框开始:首次打招呼用户

public Task DialogBegin(DialogContext dc, IDictionary<string, object> dialogArgs = null)
{
    var state = dc.Context.GetConversationState<EchoState>();
    string greetMessage = string.Format("Hi, I am {0}.", _botName);
    dc.Context.SendActivity(greetMessage);
    IList<CardAction> suggestedActions = new List<CardAction>
    {
        //some card action suggestions
    };
    var activity = MessageFactory.SuggestedActions(suggestedActions, text: "Please select the area of conversation.");
    dc.Context.SendActivity(activity);
    dc.End();
    return Task.CompletedTask;
}

对话对话框-对话框开始:在与用户打招呼后继续进行后续对话

public Task DialogBegin(DialogContext dc, IDictionary<string, object> dialogArgs = null)
{
    string activity = "test";
    dc.Context.SendActivity(activity);
    dc.Continue();
    return Task.CompletedTask;
}

我在Bot类的GreetingDialog方法内,在ConversationUpdate事件中调用ConversationDialog,在随后的消息接收事件中调用OnTurn

我的Bot课堂中的

OnTurn事件:

public async Task OnTurn(ITurnContext context)
{
    var state = context.GetConversationState<EchoState>();
    var dialogCtx = _dialogs.CreateContext(context, state);
    if (context.Activity.Type == ActivityTypes.ConversationUpdate)
    {
        //Greet user first time
        if (context.Activity.MembersAdded[0].Id == "default-user")
        {
            return;
        }
        if (!context.Responded)
        {
            var args = new Dictionary<string, object>
            {
                ["greetingArgs"] = context.Activity.Text
            };
            await dialogCtx.Begin("greetingDialog", args);
        }
    }
    else if (context.Activity.Type == ActivityTypes.Message)
    {
        await dialogCtx.Continue(); //this line is supposed to execute Begin the active dialog again??
        //if (!context.Responded)
        if(dialogCtx.ActiveDialog == null || !dialogCtx.Context.Responded)
        {
            var args = new Dictionary<string, object>
            {
                ["conversationArgs"] = context.Activity.Text
            };
            await dialogCtx.Begin("conversationDialog", args);
        }
    }
}

使用上面的代码,我被重定向到ConversationDialog,但是它仅通过await dialogCtx.Begin("conversationDialog", args);发生。我执行DialogBegin时是否应该重定向到“活动”对话框的await dialogCtx.Continue();?我可以看到“活动”对话框是“ conversationDialog”,调试器逐步通过await dialogCtx.Continue();。请帮忙吗?

1 个答案:

答案 0 :(得分:0)

我想我明白了。我们可以像这样为Dialog类实现IDialogContinue接口-

public class QnADialog : IDialog, IDialogContinue
{
    public Task DialogBegin(DialogContext dc, IDictionary<string, object> dialogArgs = null)
    {
        string activity = "test";
        dc.Context.SendActivity(activity);
        //dc.Continue();
        return Task.CompletedTask;
    }

    public Task DialogContinue(DialogContext dc)
    {
        dc.Context.SendActivity("dc continue");
        dc.Context.Responded = true;
        return Task.CompletedTask;
    }
}

然后,我们可以使用DialogContinue方法来处理调用代码中的DialogContext.Continue()