【问题标题】:Example SNS subscription confirmation using AWS .NET SDK使用 AWS .NET SDK 的示例 SNS 订阅确认
【发布时间】:2019-06-07 16:45:54
【问题描述】:

我正在尝试弄清楚如何使用 AWS .NET SDK 来确认订阅 SNS 主题。

订阅是通过 HTTP 进行的

端点将位于 .net mvc 网站中。

我在任何地方都找不到任何 .net 示例?

一个可行的例子会很棒。

我正在尝试这样的事情

 Dim snsclient As New Amazon.SimpleNotificationService.AmazonSimpleNotificationServiceClient(ConfigurationSettings.AppSettings("AWSAccessKey"), ConfigurationSettings.AppSettings("AWSSecretKey"))

    Dim TopicArn As String = "arn:aws:sns:us-east-1:991924819628:post-delivery"


    If Request.Headers("x-amz-sns-message-type") = "SubscriptionConfirmation" Then

        Request.InputStream.Seek(0, 0)
        Dim reader As New System.IO.StreamReader(Request.InputStream)
        Dim inputString As String = reader.ReadToEnd()

        Dim jsSerializer As New System.Web.Script.Serialization.JavaScriptSerializer
        Dim message As Dictionary(Of String, String) = jsSerializer.Deserialize(Of Dictionary(Of String, String))(inputString)

        snsclient.ConfirmSubscription(New Amazon.SimpleNotificationService.Model.ConfirmSubscriptionRequest With {.AuthenticateOnUnsubscribe = False, .Token = message("Token"), .TopicArn = TopicArn})


   End If

【问题讨论】:

    标签: asp.net-mvc vb.net amazon-web-services amazon-sns


    【解决方案1】:

    这是一个使用 MVC WebApi 2 和最新 AWS .NET SDK 的工作示例。

    var jsonData = Request.Content.ReadAsStringAsync().Result;
    var snsMessage = Amazon.SimpleNotificationService.Util.Message.ParseMessage(jsonData);
    
    //verify the signaure using AWS method
    if(!snsMessage.IsMessageSignatureValid())
        throw new Exception("Invalid signature");
    
    if(snsMessage.Type == Amazon.SimpleNotificationService.Util.Message.MESSAGE_TYPE_SUBSCRIPTION_CONFIRMATION)
    {
        var subscribeUrl = snsMessage.SubscribeURL;
        var webClient = new WebClient();
        webClient.DownloadString(subscribeUrl);
        return "Successfully subscribed to: " + subscribeUrl;
    }
    

    【讨论】:

      【解决方案2】:

      基于上面@Craig 的回答(这对我有很大帮助),下面是一个用于消费和自动订阅 SNS 主题的 ASP.NET MVC WebAPI 控制器。 #WebHooksFTW

      using RestSharp;
      using System;
      using System.Net;
      using System.Net.Http;
      using System.Reflection;
      using System.Web.Http;
      using System.Web.Http.Description;
      
      namespace sb.web.Controllers.api {
        [System.Web.Mvc.HandleError]
        [AllowAnonymous]
        [ApiExplorerSettings(IgnoreApi = true)]
        public class SnsController : ApiController {
          private static string className = MethodBase.GetCurrentMethod().DeclaringType.Name;
      
          [HttpPost]
          public HttpResponseMessage Post(string id = "") {
            try {
              var jsonData = Request.Content.ReadAsStringAsync().Result;
              var sm = Amazon.SimpleNotificationService.Util.Message.ParseMessage(jsonData);
              //LogIt.D(jsonData);
              //LogIt.D(sm);
      
              if (!string.IsNullOrEmpty(sm.SubscribeURL)) {
                var uri = new Uri(sm.SubscribeURL);
                var baseUrl = uri.GetLeftPart(System.UriPartial.Authority);
                var resource = sm.SubscribeURL.Replace(baseUrl, "");
                var response = new RestClient {
                  BaseUrl = new Uri(baseUrl),
                }.Execute(new RestRequest {
                  Resource = resource,
                  Method = Method.GET,
                  RequestFormat = RestSharp.DataFormat.Xml
                });
                if (response.StatusCode != System.Net.HttpStatusCode.OK) {
                  //LogIt.W(response.StatusCode);
                } else {
                  //LogIt.I(response.Content);
                }
              }
      
              //read for topic: sm.TopicArn
              //read for data: dynamic json = JObject.Parse(sm.MessageText);
              //extract value: var s3OrigUrlSnippet = json.input.key.Value as string;
      
              //do stuff
              return Request.CreateResponse(HttpStatusCode.OK, new { });
            } catch (Exception ex) {
              //LogIt.E(ex);
              return Request.CreateResponse(HttpStatusCode.InternalServerError, new { status = "unexpected error" });
            }
          }
        }
      }
      

      【讨论】:

      • 如何告诉 SNS 向该 URL 发送流量?
      【解决方案3】:

      我不知道最近发生了什么变化,但我发现 AWS SNS 现在提供了一种非常简单的订阅方法,不涉及使用 RESTSharp 提取 url 或构建请求.....这是简化的WebApi POST 方法:

          [HttpPost]
          public HttpResponseMessage Post(string id = "")
          {
              try
              {
                  var jsonData = Request.Content.ReadAsStringAsync().Result;
                  var sm = Amazon.SimpleNotificationService.Util.Message.ParseMessage(jsonData);
      
                  if (sm.IsSubscriptionType)
                  {
                      sm.SubscribeToTopic(); // CONFIRM THE SUBSCRIPTION
                  }
                  if (sm.IsNotificationType) // PROCESS NOTIFICATIONS
                  {
                      //read for topic: sm.TopicArn
                      //read for data: dynamic json = JObject.Parse(sm.MessageText);
                      //extract value: var s3OrigUrlSnippet = json.input.key.Value as string;
                  }
      
                  //do stuff
                  return Request.CreateResponse(HttpStatusCode.OK, new { });
              }
              catch (Exception ex)
              {
                  //LogIt.E(ex);
                  return Request.CreateResponse(HttpStatusCode.InternalServerError, new { status = "unexpected error" });
              }
          }
      

      【讨论】:

      • 这是旧帖子,但无论如何我都会尝试。我正在尝试在 Message 类上使用 SubscribeToTopic() 方法,但由于某种原因它不存在。我正在使用 AWSSDK.SimpleNotificationService NuGet 包,版本:3.3.3.23,但方法不存在。你能告诉我你用过哪些 NuGet 吗?公平警告:我使用的是 .NET Core 2.2:)
      【解决方案4】:

      以下示例帮助我使用 SNS。它经历了使用主题的所有步骤。在这种情况下,订阅请求是一个电子邮件地址,但可以更改为 HTTP。

      Pavel's SNS Example
      Documentation

      【讨论】:

      • 谢谢,但该示例不包括通过 http 确认订阅,这是我遇到的具体问题。
      【解决方案5】:

      我最终使用显示的代码让它工作。我在开发服务器上捕获异常时遇到了问题,结果告诉我服务器的时间与 SNS 消息中的时间戳不匹配。

      一旦服务器的时间确定了(顺便说一句,亚马逊服务器),确认就起作用了。

      【讨论】:

        猜你喜欢
        • 2023-03-10
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        • 2022-11-20
        • 1970-01-01
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多