我正在尝试通过 Amazon SNS 向移动设备发送远程通知。我有一个数据库,用于存储需要提供给 SNS 的 PublishRequest 的 JSON(有效负载)。我在代码中序列化 json 并将其传递给请求。
问题是 SNS 失败并出现错误:“消息结构 - JSON 消息正文无法解析”
作为要求,服务(负责与 SNS 通信并发送通知)必须从 DB (MySQL) 检索 json。
我缺少什么?
数据库是MySQL,服务是用.Net Core编写的
string messageFromDb = JsonConvert.SerializeObject(input.Payload);
var request = new PublishRequest
{
TargetArn = endpoint.EndpointArn,
MessageStructure = "json",
Message = messageFromDb
};
PublishResponse publishResponse = await _client.PublishAsync(request);
来自数据库的 JSON:
{"APNS": {"aps": {"alert": "Check out the new!", "sound": "default"}, "category": {"type": "sports"}}}
我也尝试过这个但没有任何运气:
{"default": "something", "APNS": {"aps": {"alert": "Check out the new games!", "sound": "default"}, "game": {"type": "Xbox"}}}
终于我明白了,也许这个答案会对某人有所帮助。数据库中的 JSON 应该是
{"aps": {"alert": "Check out the new!", "sound": "default"}, "category": {"type": "sports"}}
.Net 代码应该是:
AWSRoot obj = new AWSRoot(input.Payload);
var request = new PublishRequest
{
TargetArn = endpoint.EndpointArn,
MessageStructure = "json",
Message = JsonConvert.SerializeObject(obj)
};
PublishResponse publishResponse = await _client.PublishAsync(request);
AWSRoot是我们为SNS创建的根对象
public class AWSRoot
{
public string APNS { get; set; }
public AWSRoot(string payload)
{
APNS = payload;
}
}
乔治的上述回答很有帮助,并为我指明了正确的方向。这并不是要取代他的答案,但在对我的问题进行多次搜索后,这篇文章是最接近的匹配。
使用 C# .Net 8、Lambda 到 SNS,我不断收到错误
Invalid parameter: Message Structure - No default entry in JSON message body
解决方案是将 AWSRoot 类中的自定义类包装在名为
default
参数的参数中。由于 'default' 是保留字,因此您需要向属性添加 JsonPropertyName
描述符。
代码如下;
public class MyCustomClass
{
public string foo { get; set; } = string.Empty;
public string bar { get; set; } = string.Empty;
}
public class AWSRoot
{
/* The SNS publisher requires an attribute named `default` if the MessageStructure is 'json'*/
[JsonPropertyName("default")]
public string Default { get; set; } = string.Empty;
public AWSRoot(string payload)
{
Default = payload;
}
}
var notificationEvent = new MyCustomClass
{
foo = "Hello",
bar = "world"
};
AWSRoot obj = new AWSRoot(JsonSerializer.Serialize(notificationEvent));
var publishRequest = new PublishRequest
{
TopicArn = "your-sns-topic-arn",
Message = JsonSerializer.Serialize(obj),
MessageStructure = "json"
};
var result = await _snsClient.PublishAsync(publishRequest);
我希望这对某人有帮助,因为文档不是很清楚。