You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何订阅Bot Framework WebChat的令牌刷新事件?

解决WebChat自动令牌刷新的订阅问题

我之前也碰到过这个棘手的问题——WebChat的自动令牌刷新机制没有直接暴露可订阅的Observable,但其实我们可以通过监听WebChat内部的store action来完美解决,完全不需要依赖轮询方案。

核心解决方案:监听DIRECT_LINE/TOKEN_RECEIVED Action

WebChat在每次获取或刷新令牌时,都会向内部store分发DIRECT_LINE/TOKEN_RECEIVED这个action,我们可以通过自定义store中间件拦截这个action,从而实时获取新令牌。

具体实现代码如下:

// 1. 创建自定义store,添加中间件监听令牌刷新事件
const store = window.WebChat.createStore({}, ({ dispatch }) => next => action => {
  // 拦截令牌接收/刷新的action
  if (action.type === 'DIRECT_LINE/TOKEN_RECEIVED') {
    const newToken = action.payload.token;
    console.log('新令牌已刷新:', newToken);
    // 在这里添加你的业务逻辑,比如保存令牌到本地存储、同步到其他系统等
    // 示例:localStorage.setItem('webchat_token', newToken);
  }
  return next(action);
});

// 2. 渲染WebChat时传入这个自定义store
window.WebChat.renderWebChat({
  directLine: window.WebChat.createDirectLine({ token: '你的初始令牌' }),
  store: store
}, document.getElementById('webchat'));

为什么connectionStatus$的ExpiredToken不生效?

你提到的ConnectionStatus.ExpiredToken场景,只有在使用已过期的令牌初始化连接时才会触发。而WebChat的自动刷新机制是在令牌过期前主动发起的(默认15分钟刷新一次),整个过程不会触发令牌过期的连接状态,所以这个Observable无法捕获自动刷新事件。

对比临时轮询方案的优势

  • 事件驱动,实时性强:不需要设置固定间隔轮询,令牌刷新时立即触发回调
  • 性能更优:避免了不必要的定时检查,减少资源消耗
  • 官方可靠:基于WebChat内部的状态更新机制,兼容性和稳定性更有保障

内容的提问来源于stack exchange,提问作者Arhire Ionut

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:54:39