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

Botframework 通过DirectLine向WebChat发送消息时出错,botframework,direct-line-botframework,Botframework,Direct Line Botframework,我在Azure中部署了一个机器人。使用最新的>net bot框架(v3)。 前端使用香草网络帽。我正在尝试将一个事件从BOT发送到客户端,以便触发webchat可见历史记录的擦除。 当我的机器人试图发送事件消息时,我收到了一个毫无用处的502错误 在我的前端设置web聊天和directline的JS是: var botConnection = new BotChat.DirectLine({ secret: {secret removed..becuase secret

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

在我的前端设置web聊天和directline的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();
  }        
这里的想法是,我的bot代码将创建一个值为'clearChatHistory'的'activity'类型的消息。这会在我的客户身上触发密码

发送此消息的代码为:

 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”调用时发生bot失败

最接近错误的是客户端 “502(坏网关)”

此时将显示Visual Studio输出窗口 'Microsoft.Rest.TransientFaultHandling.HttpRequestWithStatusException' 和“Microsoft.Bot.Connector.ErrorResponseException” 例外情况


如果您能了解我可能做错了什么或在这里发生了什么,我们将不胜感激。

您正在设置事件的
值,但正在检查
名称。如果将其用作过滤器,则应能正常工作:

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


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

我发现了问题所在。首先,我的代码示例中有一个bug,Mark B指出了这个bug。然而,这不是问题的根源,但它确实帮助我找到了真正的问题。 坏网关问题也不是问题的好指标。我必须做大量的跟踪编写和代码逐步通过,以最终注意到发生了什么。我会尽力描述这个问题,这样你们都能从我愚蠢的错误中吸取教训

为了理解这个问题,您需要理解这行代码在做什么

 Activity clearMessage = activity.CreateReply();
CreateReply()从现有活动创建新活动。当它这样做时,它交换From和Recipient的值。这是因为您希望回复原始邮件的发件人。完全有意义

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

当bot框架尝试向自己发送消息时,它被排除,但失败。为什么它会出现坏网关错误,我不清楚,并将继续研究

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

var newMessage = context.MakeMessage()
而不是createReply()。这不会从和收件人进行交换


现在一切都进展得很顺利。我的代码现在将强制擦除WebChat客户端中可见的聊天历史记录。

谢谢。你是对的,这不是问题,但它是一个问题。当我解决这个问题时,它让我想到了我遇到的最终问题。