示例#1
0
    public async ValueTask <EventHandlingStatus> HandleEvent(IMessageConsumeContext context)
    {
        using var activity = SubscriptionActivity
                             .Create(
                  $"{Constants.Components.EventHandler}.{DiagnosticName}/{context.MessageType}",
                  ActivityKind.Internal,
                  tags: _defaultTags
                  )
                             ?.SetContextTags(context)
                             ?.Start();

        try {
            var status = await _innerHandler.HandleEvent(context).NoContext();

            if (activity != null && status == EventHandlingStatus.Ignored)
            {
                activity.ActivityTraceFlags = ActivityTraceFlags.None;
            }

            activity?.SetActivityStatus(ActivityStatus.Ok());

            return(status);
        }
        catch (Exception e) {
            activity?.SetActivityStatus(ActivityStatus.Error(e, $"Error handling {context.MessageType}"));
            throw;
        }
    }
        public async Task UpsertSubscriptionActivity(SubscriptionActivity subscriptionActivity)
        {
            if (_dbContext.SubscriptionActivities.Count(x => x.AccountObjectId == subscriptionActivity.AccountObjectId &&
                                                        x.AccountTenantId == subscriptionActivity.AccountTenantId &&
                                                        x.UserPrincipalName == subscriptionActivity.UserPrincipalName) != 0)
            {
                _dbContext.Update(subscriptionActivity);
            }
            else
            {
                _dbContext.Add(subscriptionActivity);
            }

            await _dbContext.SaveChangesAsync().ConfigureAwait(false);
        }
示例#3
0
    public override async ValueTask Send(
        IMessageConsumeContext context,
        Func <IMessageConsumeContext, ValueTask>?next
        )
    {
        if (context.Message == null || next == null)
        {
            return;
        }

        using var activity = Activity.Current?.Context != context.ParentContext
            ? SubscriptionActivity.Start(
                  $"{Constants.Components.Consumer}.{context.SubscriptionId}/{context.MessageType}",
                  ActivityKind.Consumer,
                  context,
                  _defaultTags
                  )
            : Activity.Current;

        if (activity?.IsAllDataRequested == true && context is DelayedAckConsumeContext delayedAckContext)
        {
            activity.SetContextTags(context)?.SetTag(TelemetryTags.Eventuous.Partition, delayedAckContext.PartitionId);
        }

        try {
            await next(context).NoContext();

            if (activity != null)
            {
                if (context.WasIgnored())
                {
                    activity.ActivityTraceFlags = ActivityTraceFlags.None;
                }

                activity.SetActivityStatus(ActivityStatus.Ok());
            }
        }
        catch (Exception e) {
            activity?.SetActivityStatus(ActivityStatus.Error(e, $"Error handling {context.MessageType}"));
            throw;
        }
    }
示例#4
0
    public override async ValueTask Consume(IMessageConsumeContext context)
    {
        if (context.Message == null)
        {
            return;
        }

        using var activity = Activity.Current?.Context != context.ParentContext
            ? SubscriptionActivity.Start(context, _defaultTags) : Activity.Current;

        activity?.SetContextTags(context)?.Start();

        try {
            await _inner.Consume(context).NoContext();
        }
        catch (Exception e) {
            activity?.SetStatus(ActivityStatus.Error(e, $"Error handling {context.MessageType}"));
            throw;
        }
    }
示例#5
0
        internal static async Task ManageSubscription(SubscriptionActivity currentSubscriptionActivity, string oid, string tid, string upn, IConfiguration config, IMsalAccountActivityStore msalAccountActivityStore, GraphServiceClient _graphServiceClient, IMsalTokenCacheProvider msalTokenCacheProvider)
        {
            string subscriptionId  = null;
            string changeToken     = null;
            string notiticationUrl = config.GetValue <string>("Files:SubscriptionService");
            int    subscriptionLifeTimeInMinutes = config.GetValue <int>("Files:SubscriptionLifeTime");

            if (subscriptionLifeTimeInMinutes == 0)
            {
                subscriptionLifeTimeInMinutes = 15;
            }

            // Load the current subscription (if any)
            var currentSubscriptions = await _graphServiceClient.Subscriptions.Request().GetAsync();

            var currentOneDriveSubscription = currentSubscriptions.FirstOrDefault(p => p.Resource == "me/drive/root");

            // If present and still using the same subscription host then update the subscription expiration date
            if (currentOneDriveSubscription != null && currentOneDriveSubscription.NotificationUrl.Equals(notiticationUrl, StringComparison.InvariantCultureIgnoreCase))
            {
                // Extend the expiration of the current subscription
                subscriptionId = currentOneDriveSubscription.Id;
                currentOneDriveSubscription.ExpirationDateTime = DateTimeOffset.UtcNow.AddMinutes(subscriptionLifeTimeInMinutes);
                currentOneDriveSubscription.ClientState        = Constants.FilesSubscriptionServiceClientState;
                await _graphServiceClient.Subscriptions[currentOneDriveSubscription.Id].Request().UpdateAsync(currentOneDriveSubscription);

                // Check if the last change token was populated
                if (currentSubscriptionActivity == null)
                {
                    currentSubscriptionActivity = await msalAccountActivityStore.GetSubscriptionActivityForUserSubscription(oid, tid, upn, subscriptionId);
                }

                if (currentSubscriptionActivity != null)
                {
                    changeToken = currentSubscriptionActivity.LastChangeToken;
                }
            }
            else
            {
                // Add a new subscription
                var newSubscription = await _graphServiceClient.Subscriptions.Request().AddAsync(new Subscription()
                {
                    ChangeType                = "updated",
                    NotificationUrl           = notiticationUrl,
                    Resource                  = "me/drive/root",
                    ExpirationDateTime        = DateTimeOffset.UtcNow.AddMinutes(subscriptionLifeTimeInMinutes),
                    ClientState               = Constants.FilesSubscriptionServiceClientState,
                    LatestSupportedTlsVersion = "v1_2"
                });

                subscriptionId = newSubscription.Id;
            }

            // Store the user principal name with the subscriptionid as that's the mechanism needed to connect change event with tenant/user
            var cacheEntriesToRemove = await msalAccountActivityStore.UpdateSubscriptionId(subscriptionId, oid, tid, upn);

            // If we've found old MSAL cache entries for which we've removed the respective MsalActivity records we should also
            // drop these from the MSAL cache itself
            if (cacheEntriesToRemove.Any())
            {
                foreach (var cacheEntry in cacheEntriesToRemove)
                {
                    await(msalTokenCacheProvider as IntegratedTokenCacheAdapter).RemoveKeyFromCache(cacheEntry);
                }
            }

            if (changeToken == null)
            {
                // Initialize the subscription and get the latest change token, to avoid getting back all the historical changes
                IDriveItemDeltaCollectionPage deltaCollection = await _graphServiceClient.Me.Drive.Root.Delta("latest").Request().GetAsync();

                var deltaLink = deltaCollection.AdditionalData["@odata.deltaLink"];
                if (!string.IsNullOrEmpty(deltaLink.ToString()))
                {
                    changeToken = ProcessChanges.GetChangeTokenFromUrl(deltaLink.ToString());
                }
            }

            // Store a record per user/subscription to track future delta queries
            if (currentSubscriptionActivity == null)
            {
                currentSubscriptionActivity = new SubscriptionActivity(oid, tid, upn)
                {
                    SubscriptionId  = subscriptionId,
                    LastChangeToken = changeToken
                };
            }

            currentSubscriptionActivity.LastChangeToken = changeToken;
            currentSubscriptionActivity.SubscriptionId  = subscriptionId;

            await msalAccountActivityStore.UpsertSubscriptionActivity(currentSubscriptionActivity);
        }