Веб-службы Exchange - не удалось подписаться на уведомления pu sh с ошибкой потока - PullRequest
0 голосов
/ 28 апреля 2020

Я копался, и информация вокруг уведомлений pu sh редкая. Я столкнулся с приведенной ниже ошибкой при попытке подписаться на уведомления pu sh. Это происходит после того, как истек таймер, и еще не получено никакого уведомления, чтобы повторить попытку подписки.

Любое направление было бы полезно. У нас более 1400 подписок, каждая из которых является экземпляром класса, который использует приведенный ниже код.

Исключение:

Сообщение. В ThreadPool не было достаточно свободных потоков для завершите операцию.

Внутреннее исключение:

Trace :
   at System.Net.HttpWebRequest.BeginGetRequestStream(AsyncCallback callback, Object state)
   at Microsoft.Exchange.WebServices.Data.EwsHttpWebRequest.Microsoft.Exchange.WebServices.Data.IEwsHttpWebRequest.BeginGetRequestStream(AsyncCallback callback, Object state) in \\REDMOND\EXCHANGE\BUILD\E15\15.00.0913.015\SOURCES\sources\dev\EwsManagedApi\src\EwsManagedApi\Core\EwsHttpWebRequest.cs:line 54
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.EmitRequest(IEwsHttpWebRequest request) in \\REDMOND\EXCHANGE\BUILD\E15\15.00.0913.015\SOURCES\sources\dev\EwsManagedApi\src\EwsManagedApi\Core\Requests\ServiceRequestBase.cs:line 413

   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.BuildEwsHttpWebRequest() in \\REDMOND\EXCHANGE\BUILD\E15\15.00.0913.015\SOURCES\sources\dev\EwsManagedApi\src\EwsManagedApi\Core\Requests\ServiceRequestBase.cs:line 790
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(IEwsHttpWebRequest& request) in \\REDMOND\EXCHANGE\BUILD\E15\15.00.0913.015\SOURCES\sources\dev\EwsManagedApi\src\EwsManagedApi\Core\Requests\ServiceRequestBase.cs:line 687

   at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute() in \\REDMOND\EXCHANGE\BUILD\E15\15.00.0913.015\SOURCES\sources\dev\EwsManagedApi\src\EwsManagedApi\Core\Requests\MultiResponseServiceRequest.cs:line 157
   at Microsoft.Exchange.WebServices.Data.ExchangeService.SubscribeToPushNotificationsOnAllFolders(Uri url, Int32 frequency, String watermark, EventType[] eventTypes) in \\REDMOND\EXCHANGE\BUILD\E15\15.00.0913.015\SOURCES\sources\dev\EwsManagedApi\src\EwsManagedApi\Core\ExchangeService.cs:line 2103

   at ExchangeSubscriptionManager.Services.SubscriptionService.Subscribe() in C:\TeamCity\TC04_OPS_Agent_40\work\7ede183819f1d2a4\ExchangeSubscriptionManager\Services\SubscriptionService.cs:line 507

Примечание: частота уведомлений = 4

Фрагмент кода:

        /// <summary>
        /// Subscribes the user to push notifications
        /// </summary>
        private void Subscribe()
        {
            try
            {
                PushSubscription sub;
                if (user.TrackEmails)
                {
                    sub =
                        service.GetConn().SubscribeToPushNotificationsOnAllFolders(
                            new Uri(uri),
                            notificationFrequency,
                            subscription.Watermark,
                            user.GetEventTypes()
                    );
                }
                else
                {
                    sub =
                        service.GetConn().SubscribeToPushNotifications(
                            user.GetFolders(),
                            new Uri(uri),
                            notificationFrequency,
                            subscription.Watermark,
                            user.GetEventTypes()
                    );
                }
                logger.Log("Push Subscription started to track : " + (user.TrackEmails ? "Emails " : " ") + (user.SyncAppointments ? "Appointments" : ""));
                subscription.SubId = sub.Id;
                subscription.Watermark = sub.Watermark;
            }
            catch (Exception ex)
            {
                logger.Error("FAILED TO SUBSCRIBE", ex);
            }
            _subscriptionEstablished = DateTime.Now;


            // Setup timer
            timer = new Timer
            {
                Interval = (notificationFrequency * 60000) + 10000
            };
            timer.Elapsed += Timer_Elapsed;
            timer.Start();
        }

        /// <summary>
        /// Handles re-subscribing on timeout
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            logger.Log("Timer Elapsed, checking subscription...");

            // Make sure listener is active
            if(listener == null || !listener.IsListening)
            {
                SetupListener();
            }

            TimeSpan maxRetry = new TimeSpan(0, notificationFrequency * 6, 0);
            DateTime eventTimeout = DateTime.Now.Subtract(maxRetry);
            if (_lastNotificationReceived == DateTime.MaxValue)
            {
                // We've never received a notification, so check when we subscribed
                if (_subscriptionEstablished > eventTimeout) return;
            }
            else if (_lastNotificationReceived > eventTimeout)
            {
                return;
            }

            // Subscription has timed out or otherwise failed
            timer.Stop();
            logger.Log(string.Format("Attempting to resubscribe (last event received at {0})", _lastNotificationReceived));
            Subscribe();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...