2013-02-26 3 views
6

J'essaie de comprendre comment utiliser le SDK AWS .NET pour confirmer un abonnement à un sujet SNS.Exemple de confirmation d'abonnement SNS avec AWS .NET SDK

L'abonnement est via HTTP

Le critère d'évaluation sera en .net site mvc.

Je ne trouve aucun exemple .net n'importe où?

Un exemple de travail serait fantastique.

J'essaie quelque chose comme ça

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 

Répondre

0

j'ai fini par fonctionner en utilisant le code affiché. J'avais des problèmes pour capturer l'exception sur le serveur de développement qui s'est avéré me dire que l'heure du serveur ne correspondait pas à l'horodatage dans le message SNS.

Une fois que l'heure du serveur a été fixée (un serveur Amazon BTW), la confirmation a fonctionné.

0

L'exemple suivant m'a aidé à travailler avec SNS. Il passe par toutes les étapes pour travailler avec des sujets. La demande d'abonnement dans ce cas est une adresse e-mail, mais qui peut être changée en HTTP.

Pavel's SNS Example
Documentation

+0

Merci, mais cet exemple ne comprend pas la confirmation d'un abonnement via http qui est la chose spécifique que je rencontre des problèmes. –

9

Voici un exemple de travail utilisant MVC WebApi 2 et le dernier SDK AWS .NET.

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

appuyant sur @ la réponse de Craig ci-dessus (ce qui m'a beaucoup aidé), le ci-dessous est un contrôleur ASP.NET MVC WebAPI pour la consommation et l'auto-abonnement à des sujets SNS. #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

Je ne sais pas comment cela a changé récemment, mais je l'ai trouvé que AWS SNS fournit maintenant une méthode très simple pour abonnée qui ne nécessite pas d'extraction urls ou des demandes de construction utilisant RESTSharp .. ... Voici la méthode simplifiée 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" }); 
     } 
    }