Bot对话框没有等待 机器人信息 SDK平台:.NET SDK版本:3.15.3 活动频道:不适用 部署环境:使用Emulator进行本地开发 问题说明

Bot对话框没有等待 机器人信息 SDK平台:.NET SDK版本:3.15.3 活动频道:不适用 部署环境:使用Emulator进行本地开发 问题说明,.net,botframework,.net,Botframework,使用仿真器进行测试时,程序不会等待用户输入上下文。等待,也不会将对话框转发到其他对话框 代码示例 My Messages Controller在连接新用户时触发问候: if(activity.Type == ActivityTypes.ConversationUpdate) { if (activity.MembersAdded.Count == 1) { await Conversation.SendAsync(activity, () => new Di

使用仿真器进行测试时,程序不会等待用户输入上下文。等待,也不会将对话框转发到其他对话框

代码示例 My Messages Controller在连接新用户时触发问候:

if(activity.Type == ActivityTypes.ConversationUpdate)
{
    if (activity.MembersAdded.Count == 1)
    {
        await Conversation.SendAsync(activity, () => new Dialogs.GreetDialog());
    }
}
然后,“我的问候”对话框输出“你好”,并转发给GatherUserDialog:

public async Task StartAsync(IDialogContext context)
{
       context.UserData.Clear();
       context.Wait(GatherInfoAsync);
}

private async Task GatherInfoAsync(IDialogContext context, IAwaitable<object> args)
{
     var activity = await args as Activity;

     if (!(context.UserData.ContainsKey("askedname")))
     {
           await context.PostAsync("Hello!");
           await context.Forward(new GatherUserDialog(), this.MessageReceivedAsync, activity);
     }

}
公共异步任务StartAsync(IDialogContext上下文)
{
context.UserData.Clear();
Wait(gathereinfoasync);
}
专用异步任务GatherInfoAsync(IDialogContext上下文,IAwaitable参数)
{
var活动=等待参数作为活动;
if(!(context.UserData.ContainsKey(“askedname”))
{
等待上下文。PostAsync(“你好!”);
wait context.Forward(新建GathereUserDialog(),this.MessageReceivedAsync,activity);
}
}
My GatherUserDialog应提示用户输入用户名,然后连接到db并使用所述用户名获取用户:

Object person;

public async Task StartAsync(IDialogContext context)
{
    await context.PostAsync("May I please have your username?");
    context.UserData.SetValue("askedname", true);
    context.Wait(MessageReceivedAsync);
}

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
    var activity = await result as Activity;
    await result;
    using (SoCoDirectoryModel model = new SoCoDirectoryModel())
    {
        var ents = model.Entities;
        var text = activity.Text;
        this.person = (from e in model.Entities
                               where e.EmployeeId == activity.Text
                               select e).SingleOrDefault();
    }
    if (this.person == null)
    {
        await context.PostAsync("Could not find that user. Please try again.");
        context.Wait(MessageReceivedAsync);
    }
    else
    {
        this.person = person as Ent;
        await context.PostAsync($"Hello {(this.person as Ent).FirstName}, what can I do for you?");
        context.Wait(MessageReceivedAsync);

    }
    context.Wait(MessageReceivedAsync);
}
对象人;
公共异步任务StartAsync(IDialogContext上下文)
{
等待上下文。PostAsync(“可以告诉我您的用户名吗?”);
context.UserData.SetValue(“askedname”,true);
Wait(MessageReceivedAsync);
}
专用异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable结果)
{
var活动=等待作为活动的结果;
等待结果;
使用(SoCoDirectoryModel=new SoCoDirectoryModel())
{
var ents=模型实体;
var text=activity.text;
this.person=(来自model.Entities中的e
其中e.EmployeeId==activity.Text
选择e).SingleOrDefault();
}
if(this.person==null)
{
wait context.PostAsync(“找不到该用户,请重试”);
Wait(MessageReceivedAsync);
}
其他的
{
this.person=作为Ent的人;
wait context.PostAsync($“Hello{(this.person as Ent).FirstName},我能为您做些什么?”;
Wait(MessageReceivedAsync);
}
Wait(MessageReceivedAsync);
}
```

复制步骤 我不知道该在这里放什么,除了上面的代码和更新NuGet包以使用最新的稳定版本包之外,我没有做任何特殊的事情

预期行为 预期的行为应该是问候,然后提示输入用户名,然后传递用户名以用于获取帐户信息

实际结果 模拟器似乎在启动时发送了2条POST, state.getConversationData和state.getPrivateConversationData,两者同时运行,并在bot为输入而应保持的任何等待期间继续运行。到达GatherUserDialog后,程序无法停止用户输入,并使用空字符串尝试linq代码。 我相信这会导致超时异常和“对不起,我的bot代码有问题。”

显然我不能发布图片,所以这里有一个链接到聊天的图片:
这是一个已知的问题。当bot连接到会话时,以及当用户连接到会话时,ConversationUpdate由直连连接器发送。当Direct Line连接器发送ConversationUpdate时,它不会发送正确的User.Id,因此bot无法构建对话框堆栈。emulator的行为不同(它会立即发送bot和用户ConversationUpdate事件,并发送正确的user.id。)

解决方法是不使用ConversationUpdate,从客户端发送事件,然后通过对话框响应该事件

客户端javascript:

 var user = {
            id: 'user-id',
            name: 'user name'
        };

        var botConnection = new BotChat.DirectLine({
            token: '[DirectLineSecretHere]',
            user: user
        });

        BotChat.App({
            user: user,
            botConnection: botConnection,
            bot: { id: 'bot-id', name: 'bot name' },
            resize: 'detect'
        }, document.getElementById("bot"));

        botConnection
            .postActivity({
                from: user,
                name: 'requestWelcomeDialog',
                type: 'event',
                value: ''
            })
            .subscribe(function (id) {
                console.log('"trigger requestWelcomeDialog" sent');
            });
对事件的回应:

if (activity.Type == ActivityTypes.Event)
{
    var eventActivity = activity.AsEventActivity();

    if (eventActivity.Name == "requestWelcomeDialog")
    {
         await Conversation.SendAsync(activity, () => new Dialogs.GreetDialog());
    }
}
更多信息可在此处找到:


更新(关于这一点的博客帖子):

谢谢,我会尽快回复。我没有js前端,我刚刚在使用模拟器,所以我需要构建一个,因为我无法在Postman中复制上述内容。不过,我接受这个答案。