Botframework 通过DirectLine向WebChat发送消息时出错
我在Azure中部署了一个机器人。使用最新的>net bot框架(v3)。 前端使用香草网络帽。我正在尝试将一个事件从BOT发送到客户端,以便触发webchat可见历史记录的擦除。 当我的机器人试图发送事件消息时,我收到了一个毫无用处的502错误 在我的前端设置web聊天和directline的JS是: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
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客户端中可见的聊天历史记录。谢谢。你是对的,这不是问题,但它是一个问题。当我解决这个问题时,它让我想到了我遇到的最终问题。