如何获取访问MS Bot Framework构建的S4B机器人的用户设备信息
刚好有过类似的开发经验,给你整理几个可行的方案,针对S4B(Skype for Business)渠道、C#版Bot Framework的场景:
获取S4B渠道Bot用户设备信息的可行方案
1. 核心思路:依赖S4B专属的ChannelData
首先要明确:你提到的示例SFBUserAgent (Microsoft-BotFramework/3.1+https://botframework.com/ua)是Bot Framework转发请求时的代理User-Agent,它不包含用户实际设备的类型或操作系统信息。所以必须通过S4B渠道特有的ChannelData字段来获取这些上下文信息。
2. 具体实现步骤(C#)
步骤1:定义对应ChannelData结构的实体类
S4B的ChannelData会携带客户端信息,我们可以先定义一个匹配的类来方便反序列化:
using Newtonsoft.Json; public class SfbChannelData { [JsonProperty("clientInfo")] public ClientInfo ClientInfo { get; set; } } public class ClientInfo { [JsonProperty("clientType")] public string DeviceType { get; set; } // 取值示例:"Desktop"、"Mobile" [JsonProperty("os")] public string OperatingSystem { get; set; } // 取值示例:"Windows 11"、"iOS 17.0" }
步骤2:在Bot逻辑中解析ChannelData
无论是Bot Framework v3还是v4版本,都可以从Activity对象中提取ChannelData并反序列化:
- Bot Framework v4 示例:
using Newtonsoft.Json; // 在处理TurnContext的方法中 if (turnContext.Activity.ChannelId == "skypeforbusiness") { if (turnContext.Activity.ChannelData != null) { var sfbChannelData = JsonConvert.DeserializeObject<SfbChannelData>(turnContext.Activity.ChannelData.ToString()); if (sfbChannelData?.ClientInfo != null) { string deviceType = sfbChannelData.ClientInfo.DeviceType; string osInfo = sfbChannelData.ClientInfo.OperatingSystem; // 这里可以根据设备信息执行自定义逻辑,比如发送适配不同设备的消息 } } }
- Bot Framework v3 示例:
using Newtonsoft.Json; // 在Dialog的处理方法中 if (context.Activity.ChannelId == "skypeforbusiness") { if (context.Activity.ChannelData != null) { var sfbChannelData = JsonConvert.DeserializeObject<SfbChannelData>(context.Activity.ChannelData.ToString()); if (sfbChannelData?.ClientInfo != null) { string deviceType = sfbChannelData.ClientInfo.DeviceType; string osInfo = sfbChannelData.ClientInfo.OperatingSystem; // 后续业务逻辑处理 } } }
3. 额外注意事项
- 一定要先判断
ChannelId为skypeforbusiness,避免在其他渠道(如Teams、微信)执行这段逻辑导致错误; - 如果遇到
ClientInfo为空的情况,可能是用户使用的S4B客户端版本较旧,建议做兼容处理,比如默认标记为"Unknown"; - 不同版本的S4B客户端返回的
os字段格式可能略有差异,比如有的会带版本号,有的只显示系统名称,需要根据实际情况做解析适配。
内容的提问来源于stack exchange,提问作者Vanjuli
相关产品推荐
相关产品推荐

