【问题标题】:Chatbot working in emulator and azure portal but not starting properly in web chat聊天机器人在模拟器和 Azure 门户中工作,但在网络聊天中无法正常启动
【发布时间】:2020-01-27 05:04:41
【问题描述】:

我使用 SDK v4 在 Visual Studio 2019 中创建了我的 C# 核心聊天机器人。聊天机器人会显示一张英雄卡以开始聊天。它在 Bot 模拟器和 azure 门户中运行良好,但是当使用 iframe 将其实现到网络聊天中时,它不会显示英雄卡。在传递一条消息后,它会显示英雄卡两次,或者如果我们传递英雄卡按钮值,那么它就会去随波逐流。我不知道为什么会发生这种情况,我是这个领域的初学者,这是我的第一个聊天机器人。谁能帮我找出问题所在。提前致谢

DialogAndWelcome Bot.cs 中的代码

namespace Welcome.Bots

public class DialogAndWelcomeBot<T> : DialogBot<T>
    where T : Dialog
{
    public DialogAndWelcomeBot(ConversationState conversationState, UserState userState, T dialog, ILogger<DialogBot<T>> logger)
        : base(conversationState, userState, dialog, logger)
    {
    }

    protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
    {
        foreach (var member in membersAdded)
        {
            // Greet anyone that was not the target (recipient) of this message.
            // To learn more about Adaptive Cards, see https://aka.ms/msbot-adaptivecards for more details.
            if (member.Id != turnContext.Activity.Recipient.Id)
            {
                var response = MessageFactory.Text("Hi , I’m Alexa. How could I help you");
                await turnContext.SendActivityAsync(response, cancellationToken);
                await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>("DialogState"), cancellationToken);
            }
            await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>("DialogState"), cancellationToken);
        }
    }
}

DialogBot.cs 中的代码

public DialogBot(ConversationState conversationState, UserState userState, T dialog, ILogger<DialogBot<T>> logger)
        {
            ConversationState = conversationState;
            UserState = userState;
            Dialog = dialog;
            Logger = logger;
        }

    public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
    {
        await base.OnTurnAsync(turnContext, cancellationToken);

        // Save any state changes that might have occured during the turn.
        await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
        await UserState.SaveChangesAsync(turnContext, false, cancellationToken);
    }

【问题讨论】:

  • 您能否发布代码的相关部分?如果我们能看到你的所作所为,别人提出建议会容易得多。
  • 编辑问题并重新发布。

标签: botframework chatbot


【解决方案1】:

@Basil:根据您的查询,我了解到您正在为您的 BOT 使用 Webchannel 并且您正在使用 IFrame。换句话说,如果我没记错的话,您有一个 html 文件,您在其中复制粘贴了 BOT 应用程序内 azure 门户中提供的嵌入代码,并用您的 BOT 密钥替换了嵌入代码中的占位符。 即如下所示: https://webchat.botframework.com/embed/TestBotForOauthPrompt?s=' style='min-width: 400px;宽度:100%;最小高度:500px;'>

假设我的理解是正确的,我认为 Iframe 是一种错误的方法,仅仅是因为它不是 Microsoft 推荐的用于网络频道的方法,而是您必须使用 StackOverflow POSTS 下面提供的答案:

  1. [BotFramework]: Is there a way to Display Oauth prompt in hero card or Adaptive card in a BOT Developed using SDK V4 in C#?

我知道帖子中的查询不涉及欢迎消息,但答案中有一句话 --- 修复:删除 iframe 并仅使用 WebChat 代码。这在任何地方都没有真正记录,但 iFrame 使用 botchat,它是 WebChat 的旧版本。

由于您使用的是 SDK V4 IFrame,因此不应使用上述帖子答案中提供的 HTML。

关于您的欢迎信息,我想您必须使用反向渠道支持才能在上述帖子中提供的网络渠道上工作。

最后,如果您希望您的网络频道 Bot 在所有浏览器中工作,那么您必须查看下面的 POST 答案相同:

  1. How to fix issue of HTML page for Web Chat Bot developed in C# using SDK V4 template is not opening in IE 11 browser?

希望这会有所帮助,并且我上面给出的理解是正确的。

所有这些答案均由 Microsoft 的支持工程师验证、有效并提供

问候 -柴坦扬

【讨论】:

  • 这是我的第一个机器人,所以我选择了这种方法
【解决方案2】:

这是因为“onMembersAdded”的工作原理。此事件会在用户添加到聊天时立即触发(而不是在添加机器人时)。在 Webchat / DirectLine 中,在发送第一条消息时会添加一个用户,因此欢迎消息会在第一条消息之后显示,这不是我认为欢迎消息的工作方式。

您需要一些解决方法才能正确发送欢迎消息。

不确定推荐的方式,但我就是这样做的。 (它对我来说非常有效) 将 onMembersAddedAsync 替换为:

protected override async Task OnConversationUpdateActivityAsync(ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken){

    if(turnContext.Activity.MembersAdded[0].Name == turnContext.Activity.Recipient.Name){       
var response = MessageFactory.Text("Hi , I’m Alexa. How could I help you");
                await turnContext.SendActivityAsync(response, cancellationToken);
                await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>("DialogState"), cancellationToken);
        }
    }  

这将在每次弹出对话更新时发送欢迎消息。 (当添加机器人和添加用户时) 我们希望在聊天开始时发送消息 --> 添加 Bot 时。 (在发送第一条消息后添加用户。(在 Webchat/DirectLine 中)。

因其他答案而编辑

要只收到一条消息,我们需要检查收件人(始终是机器人),否则我们将收到两条欢迎消息(一条给机器人,一条给用户)

【讨论】:

  • 感谢@BeschtPlaier,该解决方案对我有用。现在机器人开始根据需要发送欢迎消息。
  • 更新投票只是因为 IFrame 方式是推荐的方式。给出下面的正确方法。如果我的评论有意或无意地伤害了任何人,我深表歉意。
  • 为什么我的回答被否决了?可以解释一下吗?因为这个答案与 IFrame 什么的无关,所以这与 HTML 文件无关
【解决方案3】:

@BeschtPlaier 的解决方案可以正常工作,但我也想提供一个更简单的替代方案。您可以将条件从member.id != turnContext.activity.recipient.id 更改为member.id === turnContext.activity.recipient.id。所以你的 onMembersAdded 函数看起来像这样:

    protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
    {
        foreach (var member in membersAdded)
        {
            // Greet anyone that was not the target (recipient) of this message.
            // To learn more about Adaptive Cards, see https://aka.ms/msbot-adaptivecards for more details.
            if (member.Id === turnContext.Activity.Recipient.Id)
            {
                var response = MessageFactory.Text("Hi , I’m Alexa. How could I help you");
                await turnContext.SendActivityAsync(response, cancellationToken);
                await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>("DialogState"), cancellationToken);
            }
            await Dialog.RunAsync(turnContext, ConversationState.CreateProperty<DialogState>("DialogState"), cancellationToken);
        }
    }

我对我的所有机器人都使用这种方法,并且在模拟器中和部署到 Azure 中都可以正常工作。我个人更喜欢这种方法,因为您不必担心跟踪机器人名称。

【讨论】:

  • 确定这行得通吗?据我所知,“OnMembersAddedAsync”只有在添加 USER 时才会触发,而关于 Webchat 的问题是,在第一条消息之后添加了 USER,所以函数内部应该无关紧要
  • 参见docs.microsoft.com/en-us/dotnet/api/… --> "在派生类中重写它,以便为当机器人以外的成员加入对话时提供逻辑,例如你的机器人的欢迎逻辑。 "
  • 我需要显示我的欢迎信息,然后继续聊天。以上答案对我来说是正确的
  • 我确实修改了您的 C# 代码,而不是提供我的 nodejs 代码,但是是的,我在我的所有机器人中都使用了这个确切的条件,并且我在模拟器和 Azure 部署的频道中都正确收到了欢迎消息。
  • @hkhan 我正在使用 nodejs 进行编码并尝试将其转换为 C#,因此在我不熟悉该语言时这可能不合适。您也许可以使用 '==' 来获得相同的结果。
猜你喜欢
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多