关于Microsoft Graph Subscription通话数据延迟及来电号码提前获取的技术咨询
解决方案
一、为什么CallRecords订阅延迟高?
CallRecords是通话结束后后台异步生成的日志记录,本身就存在10-15分钟的延迟,无法满足实时通知需求。要实现通话结束即时通知,必须切换到通信会话的实时Webhook订阅。
二、实时通话事件订阅实现
订阅/communications/calls资源,监听通话状态的更新事件,通话状态变化(来电、接通、挂断)会实时推送通知到你的端点。
替换后的订阅代码
var subscription = new Subscription { ChangeType = "updated", NotificationUrl = "https://myendpoint.com", Resource = "/communications/calls", ExpirationDateTime = DateTimeOffset.UtcNow.AddHours(6), IncludeResourceData = true, AdditionalData = new Dictionary<string, object> { {"clientState", "your-secret-client-state"}, {"latestSupportedTlsVersion", "v1_2"} } }; await graphClient.Subscriptions.Request() .AddAsync(subscription); var subscriptions = await graphClient.Subscriptions .Request() .GetAsync();
三、在端点中处理通知
你的通知端点需要解析推送的事件,根据通话状态实现对应逻辑:
1. 通话挂断即时通知
当推送的resourceData.status字段为completed时,说明通话已挂断,此时可以立即执行后续操作。
2. 接听前获取来电号码
当推送的resourceData.status字段为incoming时,说明有来电进入(此时尚未接听),可以从resourceData.participants数组中提取来电方的号码信息:
// 示例通知中的resourceData片段 { "status": "incoming", "participants": [ { "info": { "identity": { "phoneNumber": "+8613xxxxxxxxx" // 来电号码 } } } ] }
四、注意事项
- 权限要求:需要申请
Calls.Read.All或Calls.ReadWrite.All应用权限(需管理员同意),权限范围比CallRecords更大。 - 通知端点必须支持HTTPS,且能处理Microsoft Graph的订阅验证请求(创建订阅时会发送验证令牌,需返回正确响应)。
- 订阅有效期最长为6小时,需定期续期以保持通知可用。
内容的提问来源于stack exchange,提问作者Ya Wang
相关产品推荐
相关产品推荐

