Bot Framework 弄乱了对话框状态

我目前正在使用 Microsoft 的 Bot Framework 制作聊天机器人。在我的流程中,我有一个最终对话,让用户知道他们正在参加比赛。还有一种针对未知输入的错误处理方法。这两种方法见这里:


[Serializable]

public class ConcertCityDialog : AbstractBasicDialog<DialogResult>

{

    private static FacebookService FacebookService => new FacebookService(new FacebookClient());


    [LuisIntent("ConcertCity")]

    public async Task ConcertCityIntent(IDialogContext context, LuisResult result)

    {

        var fbAccount = await FacebookService.GetAccountAsync(context.Activity.From.Id);


        var selectedCityName = result.Entities.FirstOrDefault()?.Entity;


        concert_city selectedCity;

        using (var concertCityService = new ConcertCityService())

        {

            selectedCity = concertCityService.FindConcertCity(selectedCityName);

        }


        if (selectedCity == null)

        {

            await NoneIntent(context, result);

            return;

        }


        user_interaction latestInteraction;

        using (var userService = new MessengerUserService())

        {

            var user = userService.FindByFacebookIdIncludeInteractions(context.Activity.From.Id);

            latestInteraction = user.user_interaction.MaxBy(e => e.created_at);

        }


        latestInteraction.preferred_city_id = selectedCity.id;

        latestInteraction.gif_created = true;


        using (var userInteractionService = new UserInteractionService())

        {

            userInteractionService.UpdateUserInteraction(latestInteraction);

        }


        var shareIntroReply = context.MakeMessage();

        shareIntroReply.Text = "Great choice! You are now participating in the competition. If you dare then pass your message \uD83D\uDE0E";


        await context.PostAsync(shareIntroReply);


        var reply = await MessageUtility.MakeShareMessageCard(context, fbAccount, latestInteraction, false);


        await context.PostAsync(reply);


        context.Done(DialogResult.Done);

慕桂英4014372
浏览 308回答 3
3回答

牧羊人nacy

我想我终于找到了问题所在。在我的代码中,我在静态类中实现了一个辅助方法,该方法会发送输入响应并等待一段时间。看到上下文被传递到这个静态方法中,这似乎导致了一些问题。将方法更改为扩展方法后,LuisDialog我不再有此问题。如果有人可以扩展为什么这可能是一个问题,我将不胜感激。编辑:有问题的方法:public static async Task StartTyping(IDialogContext context, int sleep){&nbsp; &nbsp; var typingMsg = context.MakeMessage();&nbsp; &nbsp; typingMsg.Type = ActivityTypes.Typing;&nbsp; &nbsp; await context.PostAsync(typingMsg);&nbsp; &nbsp; await Task.Delay(sleep);}

慕雪6442864

因为在 [LuisIntent("ConcertCity")] 您使用的是 context.Done() 所以当前对话框从堆栈中退出。这就是为什么下一条消息由上一个对话框或消息控制器处理的原因,在那里调用“无”意图并且您收到此响应reply.Text&nbsp;=&nbsp;"I'm&nbsp;not&nbsp;sure&nbsp;what&nbsp;you&nbsp;mean&nbsp;\uD83E\uDD14<br/>Which&nbsp;Grøn&nbsp;Koncert&nbsp;would&nbsp;you&nbsp;like&nbsp;to&nbsp;attend?";您不应该在每个地方都执行 context.Done(),这应该只在您必须转到堆栈上的上一个对话框时调用。
打开App,查看更多内容
随时随地看视频慕课网APP