通过DirectLine向WebChat发送消息时出错

时间:2018-09-10 16:55:28

标签: botframework direct-line-botframework

我在Azure中部署了一个机器人。使用最新的> net bot框架(v3)。  前端使用香草WebChat。我正在尝试从BOT向客户端发送事件,以触发对网络聊天可见历史记录的擦除。 当我的机器人尝试发送事件消息时,我收到了无用的502错误。

在我的前端设置网络聊天和直线的JS是:

<main>
    <div id="content" class="container">
        <div class="component page-list col-12">
            <div class="component-content">
                <ul class="items">
                    <li class="item">
                        <div class="field-first-name">Stephen</div>
                        <div class="field-last-name">King</div>
                        <div class="field-first-name">Gregory</div>
                        <div class="field-last-name">Mertens</div>
                        <div class="field-first-name">Penny</div>
                        <div class="field-last-name">Mertens</div>
                    </li>
                </ul>
            </div>
        </div>
    </div>
</main>

这里的想法是我的机器人代码将创建一个值为'clearChatHistory'的“活动”类型的消息。这会在我的客户端上触发代码。

发送此消息的代码是:

 var botConnection = new BotChat.DirectLine({
            secret: {secret removed..becuase secret},
            //token: params['t'],
            //domain: params['domain'],
            webSocket: "true" // defaults to true
        });

  BotChat.App({
      bot: bot,
      botConnection: botConnection,
      resize: 'detect',
      user: user,
      chatTitle: false,
      showUploadButton: false
  }, document.getElementById('bot'));

  //backchannel communication setup
  botConnection.activity$
    .filter(function (activity) {
      return activity.type === 'event' && activity.name === 'clearChatHistory';
    })
    .subscribe(function (activity) {
      console.log('"clearChatHistory" received');
      clearChatHistory();
    });

  function clearChatHistory() {
    $(".wc-message-wrapper").remove();
  }        

机器人故障发生在“ SendToConversationAsync”调用

我最接近错误的是客户端 “ https://directline.botframework.com/v3/directline/conversations/5OSJJILizNqGG4H7SaV6fQ/activities 502(错误网关)”

显示Visual Studio输出窗口 'Microsoft.Rest.TransientFaultHandling.HttpRequestWithStatusException' 和'Microsoft.Bot.Connector.ErrorResponseException 例外

对于我可能在做错的事情或在这里发生的事情的任何见解,将不胜感激。

2 个答案:

答案 0 :(得分:1)

您正在为事件设置value,但选中name。如果您将其用作过滤器,则它应该可以工作:

.filter(activity => activity.type === 'event' && activity.value === 'clearChatHistory')

但是,关于错误的网关,我不确定,因为我没有看到这种情况发生在您系统上的代码中。

答案 1 :(得分:1)

我弄清楚了问题所在。首先,我的代码示例中有一个错误,Mark B指出了。但是,这不是问题的根源,但确实帮助我解决了真正的问题。 错误的网关问题也不是问题的好兆头。我不得不做大量的Trace编写并逐步执行代码以最终注意到正在发生的事情。我将尽力描述问题,以便大家都可以从我的愚蠢错误中吸取教训。

了解问题,您需要了解这一行代码的作用

 Activity clearMessage = activity.CreateReply();

CreateReply()从现有的活动创建一个新的活动。执行此操作时,它将交换From和Recipient的值。这是因为您要回复原始消息来自的人。完全有道理100%。

对我来说,问题是我的原始消息也是通过在上一个对话框中调用CreateReaply()创建的。因此,我基本上创建了一条新消息发送给自己(或本例中的机器人)。我需要将消息发送给聊天机器人用户,而不是机器人。

当bot框架尝试向自己发送消息时,它除外并失败。为什么它会出现错误的网关错误,我不完全知道,并将继续对此进行研究。

要解决此问题,我将上游代码更改为使用

var newMessage = context.MakeMessage()

代替CreateReaply()。这不会交换发件人和收件人。

现在一切都进行得非常顺利。现在,我的代码将强制在WebChat客户端中擦除可见的聊天记录。

相关问题