当前位置: 首页 > 知识库问答 >
问题:

Amazon简单通知服务(SNS)-如何发布消息以通过其arn或令牌指定endpoint

锺离晗昱
2023-03-14

我正在开发一个将通知推送到移动设备的系统,我正在构建一个asp.net web api应用程序作为服务器,将移动设备注册到aws sns,作为平台应用程序的endpoint,并使用Firebase massaging服务的令牌,我已经使用aws sns控制台成功地将消息发布到移动设备,但我找不到任何文档可以指导我使用asp.net server实现它。我已经从aws控制台文档中注册并创建了endpoint部件,如下所示:

    [HttpPost]
    public void RegisterWithSNS(TokenAuth tokenAuth)
    {
        String endpointArn = EndpointArn;
        String applicationArn = "arn:aws:sns:ap-southeast-1:my arn from platform application console";

        bool updateNeeded = false;
        bool createNeeded = (null == endpointArn);

        if (createNeeded)
        {
            // No platform endpoint ARN is stored; need to call createEndpoint.
            EndpointArn = CreateEndpoint(tokenAuth.token, applicationArn);
            createNeeded = false;
        }

        Console.WriteLine("Retrieving platform endpoint data...");
        // Look up the platform endpoint and make sure the data in it is current, even if
        // it was just created.
        try
        {
            GetEndpointAttributesRequest geaReq = new GetEndpointAttributesRequest();
            geaReq.EndpointArn = EndpointArn;
            GetEndpointAttributesResponse geaRes = client.GetEndpointAttributes(geaReq);
            updateNeeded = !(geaRes.Attributes["Token"] == tokenAuth.token) || !(geaRes.Attributes["Enabled"] == "true");
        }
        catch (NotFoundException)
        {
            // We had a stored ARN, but the platform endpoint associated with it
            // disappeared. Recreate it.
            createNeeded = true;
        }

        if (createNeeded)
        {
            CreateEndpoint(tokenAuth.token, applicationArn);
        }

        Console.WriteLine("updateNeeded = " + updateNeeded);

        if (updateNeeded)
        {
            // The platform endpoint is out of sync with the current data;
            // update the token and enable it.
            Console.WriteLine("Updating platform endpoint " + endpointArn);
            Dictionary<String, String> attribs = new Dictionary<String, String>();
            attribs["Token"] = tokenAuth.token;
            attribs["Enabled"] = "true";
            SetEndpointAttributesRequest saeReq = new SetEndpointAttributesRequest();
            saeReq.EndpointArn = EndpointArn;
            saeReq.Attributes = attribs;
            client.SetEndpointAttributes(saeReq);
        }
    }

    private String CreateEndpoint(String token, String applicationArn)
    {
        String endpointArn = null;

        try
        {
            Console.WriteLine("Creating platform endpoint with token " + token);
            CreatePlatformEndpointRequest cpeReq = new CreatePlatformEndpointRequest();
            cpeReq.PlatformApplicationArn = applicationArn;
            cpeReq.Token = token;
            CreatePlatformEndpointResponse cpeRes = client.CreatePlatformEndpoint(cpeReq);
            endpointArn = cpeRes.EndpointArn;
        }
        catch (InvalidParameterException ipe)
        {
            String message = ipe.Message;
            Console.WriteLine("Exception message: " + message);
            Regex rgx = new Regex(".*Endpoint (arn:aws:sns[^ ]+) already exists with the same [Tt]oken.*",
                RegexOptions.IgnoreCase);
            MatchCollection m = rgx.Matches(message);
            if (m.Count > 0 && m[0].Groups.Count > 1)
            {
                // The platform endpoint already exists for this token, but with
                // additional custom data that createEndpoint doesn't want to overwrite.
                // Just use the existing platform endpoint.
                endpointArn = m[0].Groups[1].Value;
            }
            else
            {
                // Rethrow the exception, the input is actually bad.
                throw ipe;
            }
        }
        EndpointArn = endpointArn;
        return endpointArn;
    }        

在移动设备(android)上,我也在我的服务器api上实现了“从firebase获取令牌”和调用RegisterWithSNS(TokenAuth TokenAuth),但现在我不知道如何使用endpoint令牌或arn将消息发布到指定的endpoint。谁能告诉我怎么做?

共有1个答案

廉高邈
2023-03-14

根据@John Rotenstein对我的问题的评论,我只是自己实现了它,就像下面所说的:

    public bool PublishMessage(AWSClientModel aWSClientModel) { 
           PublishRequest publishRequest = new PublishRequest(); 
           publishRequest.Message =JsonConvert.SerializeObject(aWSClientModel.Notification); 
           publishRequest.TargetArn = aWSClientModel.EndpointArn;
           PublishResponse publishResponse = client.Publish(publishRequest); 
           if (publishResponse.HttpStatusCode == System.Net.HttpStatusCode.OK) { 
             return true; 
           } 
          return false; 
     }
 类似资料:
  • 我有一个Amazon Lambda实例和一个Amazon SNS实例。Lambda代码监视我们数据库中的变化,我希望它打电话给Amazon SNS,向我们的用户发送推送。例如: 当我们论坛上的用户收到新消息时,Lambda代码会在每次运行(每10分钟)时识别出这一变化,并应通过SNS向用户的智能手机发送推送。 说到文档,我遇到了麻烦;亚马逊的文档只讨论了如何通过SNS触发Lambda代码,而不是反

  • 试图从JavaScript SDK发送SNS消息。从亚马逊sns控制台发送的消息显示得很好, 下面是亚马逊 SNS 控制台 JSON 生成器输出,这对我来说工作正常。 但当SNS通过代码发送时,它会抛出消息错误;我正在使用Cordova推送通知插件,它需要包含一个消息标签。 1)如何为GCM(Android平台)格式化消息并将其发送?2)如何包含消息属性?

  • 背景资料 AWS服务是区域性的(例如,),boto3库要求您在访问客户端或资源之前设置默认区域。但是,这里的留档显示您可以使用通配符替换区域的SNS主题ARN。留档说: 文档:Amazon简单通知服务(Amazon SNS) 语法: 示例: 密码 当我使用boto3的SNS资源/客户端发布到主题ARN(该区域具有通配符)时,我得到以下错误。当我没有该区域的通配符时(例如,我指定了),一切正常。我查

  • 在RabbitMQ中,可以创建一个交换,然后将其绑定到多个队列,每个队列都有一个路由密钥。这使得消息传递体系结构如下所示: 客户端将消息发布到exchange中,该exchange只将路由密钥为“foo”的消息路由到队列,只将路由密钥为“bar”的消息路由到队列,所有消息都路由到队列。 我很难弄清楚如何在AWS中做到这一点。我首先想到的是在各个队列上设置权限,以接受基于主题的消息,但权限条件的唯一

  • 我试图通过注册ID使用aws. net sdk获得Endpoint Arn。但是我找不到一个好的方法来做这件事。 我的第一次尝试是运行CreatePlatformEndpoint请求与相同的注册ID,这是注册到SNS应用程序之前,由客户端(Android)发送。通过这种方式,aws api将为您提供此注册ID的Endpoint Arn。 Amazon:CreatePlatformEndpoint操

  • 我正在用FCM和SNS测试推送通知。(社交网络- 然后,我测试了连接到firebase的iOS版本,并添加了证书等。并且可以在firebase测试页面中触发向iOS设备推送通知,而不会出现任何问题。 问题是,我无法使用iOS版本触发AWS SNS到FCM的通知(android版本没有问题)。我希望它能像android一样工作。当触发来自SNS的通知时,是否有任何自定义参数需要添加到有效负载中才能使