Bot Framework上下文等待不等待下一条消息

时间:2018-10-04 19:12:15

标签: c# .net botframework luis

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

        [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,然后运行与“无”意图对应的代码。消息“调试测试”从不发送。

为什么从未调用“ confirmCustomer_getPO”?

编辑:

我在StartAsync方法中添加了一条调试消息。我不确定这种情况是否会发生,但是每次我向机器人发送消息时都会弹出,这使我相信每次我向机器人发送消息时Dialog都会重新启动:

    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调用发生的情况下,也永远不会到达waited方法的任何断点。

1 个答案:

答案 0 :(得分:1)

在与之抗争了一段时间后,我自己弄清楚了这个问题。问题出在机器人商店。我使用的InMemoryDataStore无法正常工作-切换到TableBotDataStore可解决此问题。数据存储的问题意味着状态没有被保存,因此我的“等待”和“转发”没有被保存到对话框堆栈中-任何新的传入消息都被发送到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”设置,此问题已解决,而无需对代码进行任何其他更改。