2013-02-26 58 views
6

我想弄清楚如何使用AWS .NET SDK來確認訂閱SNS主題。使用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 

回答

0

我最終得到它的工作使用中的代碼。我在開發服務器上捕獲異常時遇到了問題,結果告訴我服務器的時間與SNS消息中的時間戳不匹配。

一旦服務器的時間被解決了(亞馬遜服務器BTW),確認工作。

0

下面的例子幫助我與SNS合作。它會通過所有步驟來處理主題。在這種情況下,訂閱請求是一個電子郵件地址,但可以更改爲HTTP。

Pavel's SNS Example
Documentation

+0

謝謝,但這個例子不包括確認通過http訂閱這是我遇到的麻煩的具體的事情。 – 2013-02-27 00:31:48

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現在提供了一個非常簡單的訂閱,不涉及使用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" }); 
     } 
    }