使用C#向AWS SNS主题发布一个JSON消息

3
我正在尝试使用AWS SDK从我的C#应用程序发布Json消息到AWS SNS主题。它以字符串格式填充消息,并且消息属性字段未填充。
以下是代码示例:
        var snsClient = new AmazonSimpleNotificationServiceClient(accessId, secretrkey, RegionEndpoint.USEast1);
        PublishRequest publishReq = new PublishRequest()
        {
            TargetArn = topicARN,
            MessageStructure = "json",
            Message = JsonConvert.SerializeObject(message)
        };
        var msgAttributes = new Dictionary<string, MessageAttributeValue>();
        var msgAttribute = new MessageAttributeValue();
        msgAttribute.DataType = "String";
        msgAttribute.StringValue = "123";
        msgAttributes.Add("Objectcd", msgAttribute);
        publishReq.MessageAttributes = msgAttributes;
        PublishResponse response = snsClient.Publish(publishReq);

请说明您遇到的问题,目前不清楚具体情况。 - user9244629
2个回答

0

太巧了!我正忙着编写一个C#实现,将消息发布到SNS,然后偶然发现了这篇文章。希望这能帮到你。

我们传递给PublishMessageAsyncmessageBody参数是一个字符串,它可以是反序列化的JSON,例如。

public class SnsClient : ISnsClient
{
    private readonly IAmazonSimpleNotificationService _snsClient;
    private readonly SnsOptions _snsOptions; // You can inject any options you want here.

    public SnsClient(IOptions<SnsOptions> snsOptions, // I'm using the IOptionsPattern as I have the TopicARN defined in the appsettings.json
        IAmazonSimpleNotificationService snsClient)
    {
        _snsOptions = snsOptions.Value;
        _snsClient = snsClient;
    }

    public async Task<PublishResponse> PublishMessageAsync(string messageBody)
    {
        return await _snsClient.PublishAsync(new PublishRequest
        {
            TopicArn = _snsOptions.TopicArn,
            Message = messageBody
        });
    }
}

值得注意的是,上面的设置使用了依赖注入,所以需要您设置一个ISnsClient,并在启动应用程序时注册实例,代码如下:

services.TryAddSingleton<ISnsClient, SnsClient>();

0

虽然这是一个老问题,但我在处理类似问题时遇到了它。

当您将MessageStructure设置为“json”时。
JSON必须至少包含一个名为“default”的顶级JSON键,其值为字符串。
因此,JSON需要看起来像这样
{ "default" : "我的消息" }
我的解决方案大致如下

   var messageDict = new Dictionary<string,object>()
   messageDict["default"] = "my message";
   PublishRequest publishReq = new PublishRequest()
        {
            TargetArn = topicARN,
            MessageStructure = "json",
            Message = JsonConvert.SerializeObject(messageDict)
        };
        // if json is an object
        // then 
        messageDict["default"] = JsonConvert.SerializeObject(myMessageObject); 

我正在使用 v3 上的 PublishAsync

从文档中看到 https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/SNS/TPublishRequest.html

消息结构
获取并设置属性 MessageStructure。

如果要为每个协议发送不同的消息,则将 MessageStructure 设置为 json。例如,使用一个发布操作,您可以向短信订阅者发送短消息,并向电子邮件订阅者发送长消息。 如果将 MessageStructure 设置为 json,则 Message 参数的值必须:

是句法上有效的 JSON 对象; 并且

至少包含一个名为“default”的顶级 JSON 键,其值为字符串。

您可以定义其他顶级键来定义要发送到特定传输协议(例如“http”)的消息。

有效值:json


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接