使用Microsoft Bot Connector发送消息后如何获取Activity.Id
嘿,我之前在开发Teams机器人的时候也碰到过这个问题,刚好能给你解答~
首先得弄明白为什么会出现Id格式不一致的情况:你用的普通ConnectorClient返回的是Bot Framework服务生成的内部消息Id,而Teams平台会为每条发送成功的消息分配一个自己格式的Activity.Id——这俩本来就是不同的标识,所以格式自然对不上。
不过别担心,完全可以拿到和接收消息时一致的那个正确Activity.Id,给你两个可行的方案:
方案1:换成Teams专用的ConnectorClient
首先安装Microsoft.Bot.Connector.Teams NuGet包,然后把你的普通ConnectorClient替换成TeamsConnectorClient,它是专门针对Teams渠道做了适配的,发送消息后返回的ResourceResponse.Id就是Teams平台的真实消息Id,格式和你接收消息时拿到的完全一致:
// 初始化Teams专用的ConnectorClient var teamsConnector = new TeamsConnectorClient( new Uri(activity.ServiceUrl), new MicrosoftAppCredentials("<你的机器人AppId>", "<你的机器人App密码>") ); // 发送消息并获取正确的Teams Activity.Id var response = teamsConnector.Conversations.SendToConversation((Activity)activity); var correctActivityId = response.Id;
方案2:通过活动日志捕获真实Id
如果你不想替换现有的ConnectorClient,可以通过注册IActivityLogger来监听发送完成的活动——当Bot Framework把消息成功发送到Teams后,会收到Teams返回的真实Id,此时日志器里拿到的活动对象就已经带上了这个正确的Id:
- 先实现
IActivityLogger接口:
public class TeamsMessageLogger : IActivityLogger { public async Task LogAsync(IActivity activity) { // 只关注发送出去的消息活动 if (activity.Type == ActivityTypes.Message && !string.IsNullOrEmpty(activity.Id)) { // 这里的activity.Id就是Teams平台的真实消息Id Console.WriteLine($"已发送消息的Teams Activity.Id: {activity.Id}"); // 你可以在这里把Id存到数据库或者用于后续逻辑 } } }
- 在Bot初始化时注册这个日志器:
var containerBuilder = new ContainerBuilder(); // 注册自定义的日志器 containerBuilder.RegisterType<TeamsMessageLogger>() .As<IActivityLogger>() .InstancePerDependency(); // 更新Bot的依赖注入容器 containerBuilder.Update(Conversation.Container);
这样每次发送消息后,日志器都会自动捕获到正确的Activity.Id,完全符合你的需求。
补充小知识
Teams的Activity.Id格式一般是标准的UUID(比如169876543210-1234-5678-90ab-cdef01234567),而Bot Framework的内部Id通常是更短的字符串,这也是你一眼就能看出差异的原因~
内容的提问来源于stack exchange,提问作者David

