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

Streamlit应用连接Azure Web PubSub组失败,求助排查方案

问题分析与解决方案

关于Azure门户看不到Hub和组的说明

  • Web PubSub的Hub是动态创建的,无需在Azure门户手动配置,当客户端首次连接到某个Hub时,服务端会自动生成该Hub资源。
  • Groups是客户端动态维护的临时资源,不会在Azure门户显示,只能通过客户端API(join_group/leave_group)进行管理,服务端不会持久化存储Groups信息。

解决SendMessageError: Failed to send message.错误

1. 替换无效的Access Token

你当前代码中硬编码的access_token=access是无效的,必须使用合法的客户端访问令牌。可以通过两种方式获取:

方式一:代码生成令牌(推荐生产环境使用)

使用Azure SDK生成带权限的客户端连接URL:

import streamlit as st
from azure.messaging.webpubsub import WebPubSubServiceClient
from azure.messaging.webpubsubclient import WebPubSubClient, CallbackType, WebPubSubDataType

# 从Azure门户Web PubSub资源的"密钥"页面获取连接字符串
CONNECTION_STRING = "Endpoint=https://<your-resource>.webpubsub.azure.com;AccessKey=<your-access-key>;Version=1.0;"
HUB_NAME = "Hub"
GROUP_NAME = "group1"

if st.button("Connect"):
    # 初始化服务端客户端生成令牌
    service_client = WebPubSubServiceClient.from_connection_string(CONNECTION_STRING, hub=HUB_NAME)
    # 生成包含组权限的客户端访问URL
    token_response = service_client.get_client_access_token(group=GROUP_NAME)
    client_url = token_response["url"]

    # 初始化Web PubSub客户端
    client = WebPubSubClient(client_url)

    def handle_group_message(e):
        # 用Streamlit组件展示收到的消息,替代print
        st.success(f"Received message: {e.data}")

    with client:
        client.subscribe(CallbackType.GROUP_MESSAGE, handle_group_message)
        # 等待连接建立完成
        client.wait_for_connected()
        client.join_group(GROUP_NAME)
        # 捕获发送错误并展示详情
        try:
            client.send_to_group(GROUP_NAME, "hello world", WebPubSubDataType.TEXT)
            st.info("消息发送成功")
        except Exception as e:
            st.error(f"发送失败: {str(e)}")

方式二:Azure门户手动生成(临时测试用)

进入Web PubSub资源的**"客户端"**页面,选择目标Hub,点击"生成客户端URL",直接复制包含有效令牌的URL替换代码中的连接地址。

2. 适配Streamlit的运行模型

Streamlit每次交互(如点击按钮)会重新运行整个脚本,且默认同步执行,需要注意:

  • 使用client.wait_for_connected()确保连接建立后再执行后续操作,避免在连接未就绪时发送消息。
  • 不要依赖print输出消息,改用Streamlit的组件(如st.write/st.success)在页面展示,否则消息只会出现在后台终端。
  • 如果需要持久保持连接,可将客户端实例存入st.session_state,避免每次点击都重新创建连接:
    if "webpubsub_client" not in st.session_state:
        st.session_state.webpubsub_client = None
    
    if st.button("Connect"):
        # 生成token并初始化客户端,存入session_state
        # ...省略token生成代码...
        st.session_state.webpubsub_client = WebPubSubClient(client_url)
        # 后续操作基于session_state中的客户端实例
    

3. 检查权限配置

  • 确保生成令牌的账号(或服务主体)在Web PubSub资源的**"访问控制(IAM)"**页面拥有Web PubSub服务所有者或Web PubSub客户端角色。
  • 生成令牌时可指定具体权限,避免过度授权:
    token_response = service_client.get_client_access_token(
        group=GROUP_NAME,
        permissions=["joinGroup", "sendToGroup"]
    )
    

4. 调试错误详情

捕获异常并打印详细信息,定位具体错误原因:

try:
    client.send_to_group(GROUP_NAME, "hello world", WebPubSubDataType.TEXT)
except Exception as e:
    st.error(f"错误类型: {type(e).__name__}")
    st.error(f"错误详情: {str(e)}")

内容的提问来源于stack exchange,提问作者Debjyoti Sutradhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:52:47