如何通过直接线路从机器人对话 (c#) 向客户端 (angular) 发送 activity

How to send an activity from a bot dialog (c#) trough direct line to a client (angular)

当我在某个对话中时,我正在尝试将事件 activity 从机器人发送到客户端,但我无法让它工作...任何建议或代码我可以看看样品吗?

此外,我已经尝试创建一个反向通道并且它可以工作,但据我所知,它在机器人端只能在消息控制器中工作。

编辑*

很抱歉没有提供任何细节,上周我很匆忙。

所以我正在制作一个机器人,它将为用户填写 "report",机器人提出问题,用户给出答案。对于第一个问题,当我在第一个对话框中时,我必须在我的 angular 应用程序中调用一个函数,即在根对话框之后,它将检查用户输入和 return 一个 "Account" 如果帐户存在,则反对机器人,如果不存在,则它 return 为空...(而且我知道只创建一个 API 并直接连接到机器人,但我必须使用 angular)

我正在像这样使用后台频道:

botConnection.activity$ .filter( activity => { // tslint:disable-next-line:max-line-length return (activity.type === 'message' && activity.from['id'] === 'VisitReportV3' && activity.text === 'Please select an account...') || (activity.type === 'message' && activity.from['id'] === 'user' && this.accountFlag) }) .subscribe(activity => { if (activity.from['id'] === 'VisitReportV3' && activity.text === 'Please select an account...') { console.log('"account" received'); this.accountFlag = true; postAccountInfo(); } else if (activity.from['id'] === 'user' && this.accountFlag) { console.log('"account" flag recieved'); this.accountFlag = false; } });

这可能是完全错误的,但我不知道该怎么做..

tl;博士:

所以简而言之,我需要检查我是否在第一个对话框(或要求我提供帐户的对话框)中,如果我在然后等待下一个用户输入并调用 angular 函数来检查输入并查看是否有匹配的帐户,如果不匹配 return null 如果匹配 return 将序列化对象发送给机器人进行更多处理...我希望这能解释一些更多

在您的消息控制器中,您可能只将带有消息类型的活动转发到您的对话框。如果你使用默认的机器人模板,你可能有类似

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
    if (activity.GetActivityType() == ActivityTypes.Message)
    {
        await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
    }
    else
    {
        HandleSystemMessage(activity);
    }
    var response = Request.CreateResponse(HttpStatusCode.OK);
    return response;
}

您需要更改为

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
    if (activity.GetActivityType() == ActivityTypes.Message || activity.GetActivityType() == ActivityTypes.Event)
    {
        await Conversation.SendAsync(activity, () => new Dialogs.RootDialog());
    }
    else
    {
        HandleSystemMessage(activity);
    }
    var response = Request.CreateResponse(HttpStatusCode.OK);
    return response;
}

这会将消息和事件发送到您的对话框。请记住,您现在需要在每个对话框方法中检查它们,特别是当您期待事件时,因为用户可以在您的事件发送之前键入并发送消息。

编辑

您无法从 activity.from['id'] 获取对话框名称。但是,在您的对话框中,您可以创建一个 Activity 回复并将名称设置为其他名称。例如在你的对话中,

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
    Activity activity = await result as Activity;
    Activity reply = activity.CreateReply();
    reply.Text = "Please select an account...";
    reply.Name = "VisitReportV3";
    await context.PostAsync(reply);
}

然后在您的后台频道 JavaScript 中,您将从检查是否 activity.from['id'] === "VisitReportV3" 更改为 activity.name === "VisitReportV3"