【问题标题】:Bot Framework Context Wait not waiting for next messageBot Framework Context 等待不等待下一条消息
【发布时间】:2018-10-04 19:12:15
【问题描述】:

我正在尝试使用 Microsoft Bot Framework 构建一个对话框,以帮助用户查询采购订单状态(目前只是一个模拟)。我正在使用 LuisDialog,当它检测到“ConsultPO”意图时,它应该询问用户的“客户 ID”并等待来自用户的后续消息。但是,它会一直回到 Luis Dialog 的开头并处理意图,而不是从等待的方法中恢复。这是 Intent 的代码,可以正常运行:

        [LuisIntent("ConsultPO")]
    public async Task POIntent(IDialogContext context, LuisResult result)
    {
        string PO = "";
        foreach (var entity in result.Entities)
        {
            if (entity.Type == "purchaseOrder")
                PO = entity.Entity;
        }
        if (PO.Length != 0)
        {
            po_query = PO;
        }
        await context.PostAsync("Ok, can you confirm your customer id and I'll check for you?");
        context.Wait(confirmCustomer_getPO);
    }

这是我希望在用户回复后续消息后执行的代码:

        public async Task confirmCustomer_getPO(IDialogContext context, IAwaitable<object> argument)
    {
        await context.PostAsync("DEBUG TEST");
        IMessageActivity activity = (IMessageActivity)await argument;

        customer_query = activity.Text;
        if (po_query.Length > 0)
        {
            PurchaseOrder po = POservice.findPO(po_query, customer_query);
            await buildSendResponse(po, context);
//more non relevant code

当我在执行 context.Wait(confirmCustomer_getPO) 后回答机器人的询问时,它只是进入 LUIS,然后运行与“无”意图相对应的代码。永远不会发送消息“DEBUG TEST”。

为什么永远不会调用“confirmCustomer_getPO”?

编辑:

我在 StartAsync 方法中添加了一条调试消息。我不确定这是否应该发生,但每次我向机器人发送消息时它都会弹出,这让我相信每次我向机器人发送消息时对话框都会重新启动:

    public class EchoDialog : LuisDialog<object>
{
    public EchoDialog() : base(new LuisService(new LuisModelAttribute(
        ConfigurationManager.AppSettings["LuisAppId"], 
        ConfigurationManager.AppSettings["LuisAPIKey"], 
        domain: ConfigurationManager.AppSettings["LuisAPIHostName"])))
    {
    }

    public override Task StartAsync(IDialogContext context)
    {
        context.PostAsync("I'm in startAsync");
        return base.StartAsync(context);
    }

本地调试显示没有发生异常,并且从未到达等待方法中的任何断点,尽管确实发生了 context.Wait 调用。

【问题讨论】:

  • 如何加载 LUIS 对话框?
  • Eric,抱歉耽搁了时间,感谢您阅读我的问题。这是我的根对话框,因此直接在消息控制器 (await Conversation.SendAsync(activity, () =&gt; new EchoDialog());) 中调用默认/未更改的模板代码。我什至还没有从 EchoDialog 重命名它......
  • 您正在做的事情应该如您所愿。您是否在本地运行了机器人,并检查了输出窗口是否有错误?
  • 我在本地运行了机器人——控制台中唯一的信息是关于 localhost 不受信任和“线程以代码 0 退出”的警告——没有异常或错误。我还在 LuisDialog 的“StartAsync”方法中添加了一条调试消息。更新问题以包括...每次我向机器人发送消息时都会弹出调试消息。
  • 我无法重现此问题。你能在某个地方分享一个重现问题的简单项目吗,我来看看。

标签: c# .net botframework azure-language-understanding


【解决方案1】:

经过一段时间的斗争,我自己发现了这个问题。问题在于机器人商店。我使用的 InMemoryDataStore 无法正常工作 - 切换到 TableBotDataStore 解决了这个问题。 DataStore 的问题意味着状态没有被保存,所以我的“等待”和“转发”没有被保存到对话框堆栈中 - 任何新的传入消息都被发送到 RootDialog。

损坏 - 在 global.asax.cs 中时无法正常工作:

Conversation.UpdateContainer(
    builder =>
    {
        builder.RegisterModule(new AzureModule(Assembly.GetExecutingAssembly()));
        var store = new InMemoryDataStore(); // volatile in-memory store

        builder.Register(c => store)
            .Keyed<IBotDataStore<BotData>>(AzureModule.Key_DataStore)
            .AsSelf()
            .SingleInstance();

    });
GlobalConfiguration.Configure(WebApiConfig.Register);

我将store 更新为:

var store = new TableBotDataStore(ConfigurationManager.AppSettings["AzureWebJobsStorage"]);

我在 Azure 中的应用程序设置中的 web.config 中有一个有效的“AzureWebJobsStorage”设置,该问题已得到解决,无需对代码进行任何其他更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多