我目前正在使用 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);
}
慕雪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(),这应该只在您必须转到堆栈上的上一个对话框时调用。
- 3 回答
- 0 关注
- 307 浏览
添加回答
举报
0/150
提交
取消