基于FastAPI的Bot Framework机器人在Web Chat和模拟器无响应排查
问题分析与解决方案
核心问题
你当前的实现不符合Bot Framework标准协议规范:直接在/api/messages的POST响应里返回回复消息,这种方式仅被Teams通道兼容,但Bot Framework Emulator和Azure Test Web Chat严格遵循协议,要求机器人主动调用服务端API发送回复,而非在请求响应中返回消息内容。
修复代码
改用Bot Framework官方SDK处理消息交互,以下是修正后的FastAPI实现:
from fastapi import FastAPI, Request from fastapi.responses import Response, JSONResponse from botbuilder.core import BotFrameworkAdapter, BotFrameworkAdapterSettings, TurnContext from botbuilder.schema import Activity # 替换为你的Azure Bot注册信息 APP_ID = "<你的Microsoft App ID>" APP_PASSWORD = "<你的Microsoft App密码>" # 初始化Bot适配器 adapter_settings = BotFrameworkAdapterSettings(APP_ID, APP_PASSWORD) adapter = BotFrameworkAdapter(adapter_settings) app = FastAPI() # 处理消息的核心逻辑 async def handle_message(context: TurnContext): await context.send_activity(f"Echo: {context.activity.text}") @app.post("/api/messages") async def messages(request: Request): # 解析请求为Bot Framework标准活动对象 activity_data = await request.json() activity = Activity().deserialize(activity_data) # 用适配器处理活动,自动完成签名验证和回复发送 auth_header = request.headers.get("Authorization", "") try: await adapter.process_activity(activity, auth_header, handle_message) # 按协议要求返回204 No Content return Response(status_code=204) except Exception as e: return JSONResponse(content=str(e), status_code=500)
关键说明
- 协议要求:Bot Framework规定,收到用户消息后,机器人需返回
204 No Content响应,再通过请求中的serviceUrl地址,调用专用API发送回复消息。你之前的直接返回消息体属于非标准实现,仅Teams通道兼容。 - SDK优势:官方SDK会自动处理消息序列化、权限验证、服务端API调用等细节,避免手动构造消息时遗漏协议细节。
- 权限验证:适配器会自动校验请求的Authorization头,确保请求来自合法的Bot Framework服务。
额外检查项
- 确认Azure Bot注册的Messaging Endpoint正确指向
/api/messages,本地调试时需用ngrok等工具暴露公网地址。 - 确保代码中的Microsoft App ID和密码与Azure注册信息完全一致,避免权限验证失败导致消息无法发送。
内容的提问来源于stack exchange,提问作者user29297718
相关产品推荐
相关产品推荐

