8

AWS .NET SDK を使用して SNS トピックへのサブスクリプションを確認する方法を理解しようとしています。

サブスクリプションは HTTP 経由です

エンドポイントは .net mvc Web サイトになります。

どこにも.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
4

5 に答える 5

10

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;
}
于 2015-05-27T18:16:55.527 に答える
1

上記の@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" });
      }
    }
  }
}
于 2016-05-18T01:35:44.937 に答える
-1

次の例は、SNSでの作業に役立ちました。トピックを操作するためのすべての手順を実行します。この場合のサブスクライブ要求は電子メールアドレスですが、HTTPに変更できます。

PavelのSNSサンプル
ドキュメント

于 2013-02-26T14:13:04.323 に答える
-1

示されているコードを使用して動作させることになりました。開発サーバーで例外をキャプチャするのに問題があり、サーバーの時刻がSNSメッセージのタイムスタンプと一致しないことがわかりました。

サーバーの時刻が修正されると(AmazonサーバーBTW)、確認が機能しました。

于 2013-02-28T01:57:04.950 に答える