如何验证Bot Framework Composer聊天机器人页面重载后不再重复发送问候语
问题现象
使用Bot Framework Composer创建的聊天机器人已完成QnA Maker对接,本地运行状态正常,嵌入网站后每次刷新页面或执行特定操作时,机器人都会重复运行问候逻辑。期望实现仅首次会话发送一次问候,后续刷新页面或执行其他操作时仅加载会话历史,不重复发送问候。
现有接入代码
<script> var ctoken ='xxxxxx'; var cconversationId ='xxxxx'; window.WebChat.renderWebChat({ directLine: window.WebChat.createDirectLine({ token: ctoken, conversationId : cconversationId, watermark: 10 }), styleOptions: { hideUploadButton: true } }, document.getElementById('webchat')); document.querySelector('#webchat>*').focus(); </script>
实现与验证步骤
调整前端Web Chat初始化逻辑,新增会话信息持久化
你当前代码写死了token和conversationId,没有做本地持久化,每次刷新相当于重新创建会话,是触发重复问候的核心原因之一。修改逻辑如下:<script> // 页面加载先读取本地存储的会话信息 const savedConv = localStorage.getItem('botConversationInfo') ? JSON.parse(localStorage.getItem('botConversationInfo')) : null; let directLine; if (savedConv && savedConv.token && savedConv.conversationId) { // 有历史会话直接用存储的信息初始化 directLine = window.WebChat.createDirectLine({ token: savedConv.token, conversationId: savedConv.conversationId, watermark: savedConv.watermark || 0 }) } else { // 没有历史会话,调用你后端的DirectLine token接口申请新会话(这里替换成你自己的token获取逻辑) const res = await fetch('/api/get-directline-token').then(r => r.json()); directLine = window.WebChat.createDirectLine({ token: res.token }); // 监听会话创建事件,保存会话信息到本地 directLine.connectionStatus$.subscribe(status => { if (status === 2) { // 2代表连接成功 const conv = directLine.conversationId; localStorage.setItem('botConversationInfo', JSON.stringify({ token: res.token, conversationId: conv, watermark: 0 })) } }) } // 监听消息活动,更新最新的watermark到本地 directLine.activity$?.subscribe(activity => { if (activity.id) { const saved = JSON.parse(localStorage.getItem('botConversationInfo')); saved.watermark = Number(activity.id.split('|')[1] || 0); localStorage.setItem('botConversationInfo', JSON.stringify(saved)); } }) window.WebChat.renderWebChat({ directLine, styleOptions: { hideUploadButton: true } }, document.getElementById('webchat')); document.querySelector('#webchat>*').focus(); // 会话过期时清除本地存储的旧会话 directLine.connectionStatus$.subscribe(status => { if (status === 4) { // 4代表连接失败、 token过期 localStorage.removeItem('botConversationInfo'); } }) </script>修改Bot Framework Composer端的问候触发规则
默认问候是ConversationUpdate事件触发,即使复用会话也可能重复触发,需要加状态校验:- 找到你的问候触发节点,在触发条件里新增判断
!turn.state.user.hasGreeted - 问候消息发送完成后,添加「设置属性」动作,配置
turn.state.user.hasGreeted = true,该属性会持久化到对应用户的会话状态中,后续同一会话不会再触发问候逻辑
- 找到你的问候触发节点,在触发条件里新增判断
功能验证操作
- 首次打开网站页面,确认机器人仅发送1次问候,正常发送几条测试消息后刷新页面,确认仅加载之前的历史会话,没有新的问候消息生成
- 清除浏览器localStorage后重新打开页面,确认会触发新的问候,会话历史清空,符合新用户首次访问的逻辑
- 触发你提到的特定操作(如页面模块切换、表单提交等),确认Web Chat组件重渲染时不会触发新的问候,历史会话正常保留
- 等待DirectLine token过期(默认有效期1小时)后操作,确认会自动清除旧会话,触发新问候,无报错
内容的提问来源于stack exchange,提问作者Key
相关产品推荐
相关产品推荐

