//инициализация public static bool TryCreate(string jsonMessage, out AmazonSnsMessage amazonSnsMessage) { amazonSnsMessage = null; bool result = false; if (string.IsNullOrEmpty(jsonMessage)) return false; try { using (TextReader reader = new StringReader(jsonMessage)) using (var jsonRreader = new Newtonsoft.Json.JsonTextReader(reader)) { var serializer = new Newtonsoft.Json.JsonSerializer(); amazonSnsMessage = serializer.Deserialize<AmazonSnsMessage>(jsonRreader); } result = true; } catch (Exception ex) { } return result; }
// parse request message public bool ParseRequest(Stream request, out AmazonSnsMessage message) { string requestMessage = null; try { using (StreamReader reader = new StreamReader(request)) { requestMessage = reader.ReadToEnd(); } } catch (Exception ex) { if(_logger != null) _logger.Exception(ex, "Ошибка при получении потока данных Amazon SNS."); } if (requestMessage == null) { message = null; return false; } else { return ParseRequest(requestMessage, out message); } }
public bool ParseRequest(string request, out AmazonSnsMessage message) { message = null; bool isValid = false; // разбор json сообщения AmazonSnsMessage amazonSnsMessage; bool created = AmazonSnsMessage.TryCreate(request, out amazonSnsMessage); if (!created) { if (_logger != null) _logger.Error("Ошибка при разборе json сообщения Amazon Sns: {0}", request); return false; } // проверить подпись сообщения bool verified = _signatureVerification.VerifySignature(amazonSnsMessage); if (!verified) { if (_logger != null) _logger.Error("Не удалось подтвердить подпись сообщения Amazon Sns: {0}", request); return false; } // обработать сообщение в зависимости от типа if (amazonSnsMessage.AmazonSnsMessageType == AmazonSnsMessageType.Notification) { message = amazonSnsMessage; isValid = message.Message != null; } // подписаться else if (amazonSnsMessage.AmazonSnsMessageType == AmazonSnsMessageType.SubscriptionConfirmation && ConfirmSubsription) { isValid = _subscription.ConfirmSubscription(amazonSnsMessage); } // неизвестный тип else { if (_logger != null) _logger.Error("Получен неизвестный тип сообщения Amazon Sns: {0}", request); isValid = false; } return isValid; }
//подписаться public bool ConfirmSubscription(AmazonSnsMessage amazonSnsMessage) { string subscribeURL = amazonSnsMessage.SubscribeURL; Uri confirmUri; bool uriIsValid = Uri.TryCreate(subscribeURL, UriKind.Absolute, out confirmUri); if (!uriIsValid) { if(_logger != null) _logger.Error("Неверный адрес подтверждения подписки Amazon Sns {0}", subscribeURL); return false; } string response; try { using (WebClient webClient = new WebClient()) { response = webClient.DownloadString(confirmUri); } } catch (Exception ex) { if (_logger != null) _logger.Exception(ex, "Ошибка при получении ответа на подтверждение подписки Amazon Sns."); return false; } if (_logger != null) _logger.Debug("Получен ответ на подтверждение подписки Amazon Sns: {0}", response); bool confirmed = CheckSubscribeResponse(response); if (_logger != null) _logger.Info("Подтверждение подписки Amazon Sns закончилось с результатом {0}", confirmed); return confirmed; }
//отписаться public bool Unsubscribe(AmazonSnsMessage amazonSnsMessage) { string unsubscribeURL = amazonSnsMessage.UnsubscribeURL; Uri confirmUri; bool uriIsValid = Uri.TryCreate(unsubscribeURL, UriKind.Absolute, out confirmUri); if (!uriIsValid) { if (_logger != null) _logger.Error("Неверный адрес отказа от подписки Amazon Sns {0}", unsubscribeURL); return false; } string response; try { using (WebClient webClient = new WebClient()) { response = webClient.DownloadString(confirmUri); } } catch (Exception ex) { if (_logger != null) _logger.Exception(ex, "Ошибка при получении ответа на отказ от подписки Amazon Sns."); return false; } if (_logger != null) _logger.Debug("Получен ответ на отказ от подписки Amazon Sns: {0}", response); return CheckUnsubscribeResponse(response); }