.net core 将HeroCard中的CardActions作为欢迎信息发送,并指向相应的对话框

.net core 将HeroCard中的CardActions作为欢迎信息发送,并指向相应的对话框,.net-core,botframework,.net Core,Botframework,我正在使用Dialogs和Waterwallstep来组织对话框逻辑 我想要一张带有CardActions的HeroCard作为欢迎信息。只需将HeroCard作为欢迎信息发送即可,但我的问题是,当用户单击CardAction中的一个选项时,使用turnContext指向右侧对话框 这是我在Bots.WelcomeBot.cs中遇到的代码。这两种方法都是在OnMembersAddedAsync之后使用的,效果很好 private static async Task MainMenuAsync(I

我正在使用Dialogs和Waterwallstep来组织对话框逻辑 我想要一张带有
CardActions
HeroCard
作为欢迎信息。只需将
HeroCard
作为欢迎信息发送即可,但我的问题是,当用户单击
CardAction
中的一个选项时,使用
turnContext
指向右侧对话框

这是我在
Bots.WelcomeBot.cs
中遇到的代码。这两种方法都是在OnMembersAddedAsync之后使用的,效果很好

private static async Task MainMenuAsync(ITurnContext turnContext, CancellationToken cancellationToken)
    {
        var card = new HeroCard
        {
            Text = "Welcome! What can I help you with?",
            Buttons = new List<CardAction>
            {
                new CardAction() { Title = "Contact", Type = ActionTypes.ImBack, Value = "Contact" },
                new CardAction() { Title = "Newsletter", Type = ActionTypes.ImBack, Value = "Newsletter" },
                new CardAction() { Title = "Products", Type = ActionTypes.ImBack, Value = "Products" },
            },
        };
        var reply = MessageFactory.Attachment(card.ToAttachment());
        await turnContext.SendActivityAsync(reply, cancellationToken);
        await MainMenuChoisesAsync(turnContext, reply, cancellationToken);
    }

    private static async Task MainMenuChoisesAsync(ITurnContext turnContext, IMessageActivity reply, CancellationToken cancellationToken) {

        string choice = reply.ToString().ToLowerInvariant();

        switch (choice) {
            case "contact":
                {
                    //Direct to ContactDialog.cs
                }
        }
    }
专用静态异步任务MainMenuAsync(iTurContext turnContext,CancellationToken CancellationToken)
{
var卡=新卡
{
Text=“欢迎!有什么可以帮您的吗?”,
按钮=新列表
{
new CardAction(){Title=“Contact”,Type=ActionTypes.ImBack,Value=“Contact”},
new CardAction(){Title=“Newsletter”,Type=ActionTypes.ImBack,Value=“Newsletter”},
new CardAction(){Title=“Products”,Type=ActionTypes.ImBack,Value=“Products”},
},
};
var reply=MessageFactory.Attachment(card.ToAttachment());
等待turnContext.SendActivityAsync(回复、取消令牌);
等待MainMenuchoiseAsync(turnContext、reply、cancellationToken);
}
专用静态异步任务MainMenuChoiseAsync(iTurContext turnContext、IMessageActivity reply、CancellationToken CancellationToken){
字符串选择=reply.ToString().ToLowerInvariant();
开关(选择){
案例“联系人”:
{
//直接到ContactDialog.cs
}
}
}
最初,此选项菜单位于my Main对话框中,当用户在聊天开始时写入任何内容时,会触发该对话框。然后,下一步将重定向到右侧对话框

如果您使用的是WebChat或directline,则在创建对话时会发送bot的ConversationUpdate,在用户端首次发送消息时会发送其ConversationUpdate。最初发送ConversationUpdate时,消息中没有足够的信息来构造对话框堆栈。这在emulator中似乎起作用的原因是emulator模拟了一种伪DirectLine,但两个ConversationUpdate在emulator中同时解析,而实际服务的执行情况并非如此。 (来源:)

目前,无法对您描述的场景使用
conversationUpdate
事件。您可以通过在WebChat完全加载时发送自定义事件来解决此问题,但是您不能使用Bot服务提供的默认iframe。 看一看

请看一个示例,该示例演示如何在bot首次启动时实施欢迎活动:

  • (推荐)

您使用的是什么渠道(如webchat、facebook等)以及如何触发欢迎信息?您使用的是
conversationUpdate
事件还是自定义事件。我将在webchat中使用它。我只是把我的机器人放在一个简单的html网站上,然后我注意到简单的欢迎信息直到用户写了东西才显示出来。我使用的是
ConversationUpdate
,这与Microsoft的逻辑相同,它在使用DirectLine的Emulator中运行良好。如果您为Web聊天生成带有用户id的DirectLine令牌,您可以从
onMembersAdded
处理程序中的
ConversationUpdate
事件发送欢迎消息。