2013-02-26 24 views
6

Ich versuche herauszufinden, wie Sie mit dem AWS .NET SDK eine Subskription für ein SNS-Thema bestätigen können.Beispiel SNS-Abonnementbestätigung mit AWS .NET SDK

Das Abonnement ist über HTTP

Der Endpunkt in einer .net Mvc Website sein wird.

Ich kann nirgendwo .net Beispiele finden?

Ein funktionierendes Beispiel wäre fantastisch.

Ich versuche, so etwas wie diese

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 

Antwort

0

Ich landete sie arbeiten mit dem Code angezeigt bekommen. Ich hatte Probleme, die Ausnahme auf dem Entwicklungsserver zu erfassen, die mir sagte, dass die Zeit des Servers nicht mit dem Zeitstempel in der SNS-Nachricht übereinstimmte.

Sobald die Serverzeit behoben wurde (ein Amazon-Server BTW), funktionierte die Bestätigung.

0

Das folgende Beispiel hat mir geholfen, mit SNS zu arbeiten. Es durchläuft alle Schritte, um mit Topics zu arbeiten. Die Abonnementanforderung ist in diesem Fall eine E-Mail-Adresse, die jedoch in HTTP geändert werden kann.

Pavel's SNS Example
Documentation

+0

Danke, aber dieses Beispiel enthält keine Bestätigung eines Abonnements über http, das ist die spezifische Sache, mit der ich Probleme habe. –

9

Hier ist ein Arbeitsbeispiel mit MVC WebApi 2 und dem neuesten 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; 
} 
1

Aufbauend auf @ Craig Antwort oben (was mir sehr geholfen), die unten ist eine ASP.NET MVC WebAPI Controller für das Konsumieren und Auto-Anmeldung zu SNS Themen. #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" }); 
     } 
    } 
    } 
} 
0

Ich weiß nicht, wie dies kürzlich geändert hat, aber ich habe festgestellt, dass AWS SNS stellt nun ein sehr einfaches Verfahren für die Zeichnung, die nicht Extrahieren von URLs oder Gebäuden Anfragen mit RESTSharp mit sich bringt .. ... Hier ist die vereinfachte WebApi POST-Methode: