为了账号安全,请及时绑定邮箱和手机立即绑定

Bot Framework 弄乱了对话框状态

Bot Framework 弄乱了对话框状态

C#
慕桂英4014372 2021-06-29 13:34:21
我目前正在使用 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);
查看完整描述

3 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

我想我终于找到了问题所在。在我的代码中,我在静态类中实现了一个辅助方法,该方法会发送输入响应并等待一段时间。看到上下文被传递到这个静态方法中,这似乎导致了一些问题。


将方法更改为扩展方法后,LuisDialog我不再有此问题。


如果有人可以扩展为什么这可能是一个问题,我将不胜感激。


编辑:有问题的方法:


public static async Task StartTyping(IDialogContext context, int sleep)

{

    var typingMsg = context.MakeMessage();

    typingMsg.Type = ActivityTypes.Typing;


    await context.PostAsync(typingMsg);

    await Task.Delay(sleep);

}


查看完整回答
反对 回复 2021-07-10
?
慕雪6442864

TA贡献1812条经验 获得超5个赞

因为在 [LuisIntent("ConcertCity")] 您使用的是 context.Done() 所以当前对话框从堆栈中退出。这就是为什么下一条消息由上一个对话框或消息控制器处理的原因,在那里调用“无”意图并且您收到此响应

reply.Text = "I'm not sure what you mean \uD83E\uDD14<br/>Which Grøn Koncert would you like to attend?";

您不应该在每个地方都执行 context.Done(),这应该只在您必须转到堆栈上的上一个对话框时调用。


查看完整回答
反对 回复 2021-07-10
  • 3 回答
  • 0 关注
  • 307 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信