使用NotificationHubClient发送FCM推送时sessionId属性未接收问题
FCM模板推送sessionId丢失问题排查与解决
问题根因
你遇到的情况是典型的客户端模板注册与服务端推送字段不匹配:
- 客户端向Notification Hub注册的FCM模板中,没有包含
$(sessionId)这个占位符,所以服务端传递的sessionId会被Notification Hub直接过滤,不会出现在推送消息里。 - 而
phone和message是模板里已定义的占位符,哪怕服务端不传值,Notification Hub也会自动填充为空字符串返回给客户端,这就是它们始终存在的原因。
修复步骤
检查并更新客户端模板注册
客户端注册模板时,必须在模板JSON中加入sessionId的占位符,示例如下:{ "data": { "message": "$(message)", "phone": "$(phone)", "sessionId": "$(sessionId)" } }遗留项目大概率是早期模板没定义这个字段,后续服务端加了参数但没同步更新客户端模板。
验证模板注册状态
登录Azure Portal进入你的Notification Hub,查看对应设备注册项的模板内容,确认sessionId占位符是否存在。如果是旧注册项,需要让客户端重新注册或者更新模板。优化服务端字段传递逻辑(可选)
如果你不想让空值字段出现在消息里,可以修改服务端代码,只添加非空的字段:public static Dictionary<string, string> GetNotificationBody(string message, string phone = "", string sessionId = "") { var body = new Dictionary<string, string>(); if (!string.IsNullOrWhiteSpace(message)) body.Add("message", message); if (!string.IsNullOrWhiteSpace(phone)) body.Add("phone", phone); if (!string.IsNullOrWhiteSpace(sessionId)) body.Add("sessionId", sessionId); return body; }注意:如果模板里的占位符没有标记为可选(比如
$(message?)),必须保证对应的字段有值,否则Notification Hub会拒绝推送请求。
关键逻辑说明
Notification Hub模板推送的核心规则:
- 服务端传递的键必须与客户端模板中的占位符完全匹配,不存在的占位符对应的键会被丢弃。
- 模板中已定义的占位符,如果服务端没有传对应值,会被替换为空字符串(未标记可选时),或者直接移除该字段(标记可选时)。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

