【问题标题】:Error sending message to WebChat via DirectLine通过 DirectLine 向 WebChat 发送消息时出错
【发布时间】:2018-09-10 16:55:28
【问题描述】:

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

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

 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();
  }        

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

发送此消息的代码是:

 internal static async Task SendClearChatHistoryEvent(Activity activity)
    {
        Trace.TraceInformation($"Utility::SendClearChatHistoryEvent");

        Activity clearMessage = activity.CreateReply();
        clearMessage.Type = "event";
        clearMessage.Value = "clearChatHistory";

        Trace.TraceInformation(JsonConvert.SerializeObject(clearMessage));
        Trace.TraceInformation($"Utility::SendClearChatHistoryEvent::ServiceURL:{activity.ServiceUrl}");
        var connector = new ConnectorClient(new Uri(activity.ServiceUrl));

        await connector.Conversations.SendToConversationAsync(clearMessage);
    }

机器人失败发生在“SendToConversationAsync”调用中

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

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

任何关于我可能做错了什么或这里发生的事情的见解将不胜感激。

【问题讨论】:

    标签: botframework direct-line-botframework


    【解决方案1】:

    您在事件上设置了value,但检查了name。如果您使用它作为过滤器,它应该可以工作:

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

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

    【讨论】:

    • 谢谢。你是对的,这不是问题,但这是一个问题。当我解决这个问题时,它让我解决了我遇到的最终问题。
    【解决方案2】:

    我发现了问题所在。首先,Mark B 指出我的代码示例中有一个错误。然而,这不是问题的根源,但它确实帮助我解决了真正的问题。 坏网关问题也不是问题的一个很好的指标。我不得不编写大量的 Trace 代码并单步执行代码才能最终注意到发生了什么。我将尝试描述问题,以便大家从我愚蠢的错误中吸取教训。

    了解问题,你需要了解这行代码在做什么

     Activity clearMessage = activity.CreateReply();
    

    CreateReply() 从现有的 Activity 创建一个新的 Activiy。当它这样做时,它会交换 From 和 Recipient 的值。这是因为您想回复原始邮件的发件人。让 100% 完全有意义。

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

    当机器人框架试图向自己发送一条消息时,它异常并失败了。为什么它会出现错误的网关错误,我不完全知道,并将继续研究。

    为了解决这个问题,我将上游代码更改为使用

    var newMessage = context.MakeMessage()
    

    而不是 CreateReaply()。这不会交换 From 和 Recipient。

    现在一切都非常顺利。我的代码现在将强制清除我的 WebChat 客户端中的可见聊天历史记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多