我在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 例外
对于我可能在做错的事情或在这里发生的事情的任何见解,将不胜感激。
答案 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客户端中擦除可见的聊天记录。