2013-02-26 6 views
6

Я пытаюсь выяснить, как использовать AWS .NET SDK для подтверждения подписки на тему SNS.Пример подтверждения подписки SNS с использованием AWS .NET SDK

подписка через 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 

ответ

0

Я в конечном итоге получить его работу с помощью кода, показанного. У меня возникла проблема с захватом исключения на сервере разработки, который, как оказалось, говорил мне, что время сервера не соответствует отметке времени в сообщении SNS.

После того, как время сервера было исправлено (сервер Amazon BTW), сработало подтверждение.

0

Следующий пример помог мне работать с SNS. Он проходит все этапы работы с темами. В этом случае запрос подписки является адресом электронной почты, однако его можно изменить на HTTP.

Pavel's SNS Example
Documentation

+0

Спасибо, но этот пример не включает подтверждение подписки через http, из-за которой у меня возникают проблемы. –

9

Вот рабочий пример с использованием 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; 
} 
1

Опираясь на @ ответ Крейга выше (который мне очень помог), ниже является контроллером ASP.NET MVC WebAPI для потребления и авто-подписавшей к 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

Я не знаю, как в последнее время это изменилось, но я обнаружил, что AWS SNS теперь обеспечивает очень просто метод подписок, который не включает добывающие URLs или строительные запросы, используя RESTSharp .. ... Вот упрощенный метод 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" }); 
     } 
    } 
Смежные вопросы