コード例 #1
0
        public async Task <ClientValidationOutcome> ValidateSubscription(Subscription subscription, HubValidationOutcome outcome)
        {
            if (subscription == null)
            {
                throw new ArgumentNullException(nameof(subscription));
            }

            SubscriptionBase callbackParameters = null;

            if (outcome == HubValidationOutcome.Canceled)
            {
                logger.LogDebug("Simulating canceled subscription.");

                callbackParameters = new SubscriptionCancelled
                {
                    Reason = $"The subscription {subscription} was canceled for testing purposes.",
                };
            }
            else
            {
                logger.LogDebug("Verifying subscription.");

                callbackParameters = new SubscriptionVerification
                {
                    // Note that this is not necessarily cryptographically random/secure.
                    Challenge     = Guid.NewGuid().ToString("n"),
                    Lease_Seconds = subscription.Lease_Seconds
                };
            }

            // Default parametres for both cancel/verify.
            callbackParameters.Callback = subscription.Callback;
            callbackParameters.Events   = subscription.Events;
            callbackParameters.Mode     = subscription.Mode;
            callbackParameters.Topic    = subscription.Topic;

            logger.LogDebug($"Calling callback url: {subscription.Callback}");
            var callbackUri = new SubscriptionCallback().GetCallbackUri(subscription, callbackParameters);
            var response    = await new HttpClient().GetAsync(callbackUri);

            if (!response.IsSuccessStatusCode)
            {
                logger.LogInformation($"Status code was not success but instead {response.StatusCode}");
                return(ClientValidationOutcome.NotVerified);
            }
            if (outcome == HubValidationOutcome.Valid)
            {
                var challenge    = ((SubscriptionVerification)callbackParameters).Challenge;
                var responseBody = (await response.Content.ReadAsStringAsync());
                if (responseBody != challenge)
                {
                    logger.LogInformation($"Callback result for verification request was not equal to challenge. Response body: '{responseBody}', Challenge: '{challenge}'.");
                    return(ClientValidationOutcome.NotVerified);
                }

                return(ClientValidationOutcome.Verified);
            }

            return(ClientValidationOutcome.NotVerified);
        }
コード例 #2
0
        internal IDisposable Subscribe <T>(SubscriptionBase <T> subscription) where T : class
        {
            if (_database is null)
            {
                throw new InvalidOperationException("notification service is not initialized");
            }

            subscription.LiteCollection = _database.GetCollection <T>(subscription.Collection);
            _subscriptions.TryAdd(subscription, default);
            return(new Unsubscriber(_subscriptions, subscription));
        }
コード例 #3
0
        public Uri GetCallbackUri(Subscription subscription, SubscriptionBase parameters)
        {
            var properties = parameters.GetType().GetProperties()
                             .Where(x => x.GetValue(parameters, null) != null)
                             .Select(x => this.GetFieldName(x) + "=" + HttpUtility.UrlEncode(x.GetValue(parameters, null).ToString()));

            var addedParamteres = String.Join("&", properties.ToArray());

            var newUri = new UriBuilder(subscription.Callback);

            newUri.Query += addedParamteres;

            return(newUri.Uri);
        }
コード例 #4
0
    private void CreateSubscription()
    {
        var ids = new FolderId[2] {
            new FolderId(WellKnownFolderName.Root), new FolderId(WellKnownFolderName.Inbox)
        };
        var events = new List <EventType>();

        events.Add(EventType.NewMail);
        if (_subscription != null)
        {
            ((StreamingSubscription)_subscription).Unsubscribe();
            _connection.RemoveSubscription((StreamingSubscription)_subscription);
        }
        _subscription = _exchange.SubscribeToStreamingNotifications(ids, events.ToArray());
        _connection.AddSubscription((StreamingSubscription)_subscription);
    }
コード例 #5
0
 internal IDisposable Subscribe <T>(SubscriptionBase <T> subscription) where T : class
 {
     _subscriptions.TryAdd(subscription, default);
     return(new Unsubscriber(_subscriptions, subscription));
 }
コード例 #6
0
 private void OnSubscriptionChanged()
 {
     // Consider also defining an event and raising it here
     this._subscription =
         SubscriptionBase.GetSubscription(this.IsSubscribed);
 }