【问题标题】:Publish a json message to AWS SNS topic using C#使用 C# 将 json 消息发布到 AWS SNS 主题
【发布时间】:2021-12-01 03:54:19
【问题描述】:

我正在尝试使用 AWS SDK 从我的 C# 应用程序向 AWS SNS 主题发布 Json 消息。它的[在此处输入图像描述][1]以字符串格式填充消息,并且不填充消息属性字段。

代码示例如下:

        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);

【问题讨论】:

  • 不清楚您遇到了什么问题,请澄清。

标签: amazon-web-services aws-sdk amazon-sns


【解决方案1】:

较早的问题,但在处理类似问题时遇到的回答

当您将 MessageStructure 设置为“json”时。
json 必须至少包含一个“default”的顶级 JSON 键,其值为字符串。
所以 json 需要看起来像
{ “默认”:“我的消息” }
我的解决方案看起来像

   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。例如,使用一个发布操作,您可以向 SMS 订阅者发送一条短消息,向您的电子邮件订阅者发送一条较长的消息。如果将 MessageStructure 设置为 json,则 Message 参数的值必须:

是语法上有效的 JSON 对象;和

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

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

有效值:json

【讨论】:

    【解决方案2】:

    好巧合! 当我偶然发现这篇文章时,我正忙于编写 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>();
    

    【讨论】:

      猜你喜欢
      • 2021-10-18
      • 2019-03-19
      • 1970-01-01
      • 2019-11-05
      • 2020-07-08
      • 2019-06-18
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多