Exemple #1
0
        public async Task <IActionResult> Exchange()
        {
            Console.WriteLine(Request.GetDisplayUrl());
            // получаем информацию заголовков (по ним мы как правило можем определить нужно ли получать тело)
            var messageHeaders = packageRequestParser.GetHeaders(this.Request);

            // вначале получим и проверим статическую конфигурацию
            // TODO при перезагрузке конфига и токена не возникнут ли зависоны??
            var configData = this.GetCurrentConfigData(messageHeaders);

            messageHeaders.ConfigToken = "temp";
            // если поменялась "статическая" конфигурация, то не принимаем информацию, а просим агента сходить за новой и применить её
            // статическую конфигурацию обрабатываем отдельно, чтобы была возможность отключить часть функционала на агенте, без отрабатывания сообщений с агента
            if (messageHeaders.ConfigToken != configData.ConfigToken)
            {
                // workaround для возможности не передавать данные с клиента
                // https://github.com/dotnet/corefx/blob/v2.1.5/src/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/HttpConnection.cs#L537  (версия 2.1.5 указана для примера)
                if (messageHeaders.Hints?.Any(x => x == MessageHints.ConfigurationResponseAsHttp399) == true)
                {
                    return(this.StatusCode(399, new TransportResponse().SetStaticConfigChanged(configData)));
                }

                return(this.Ok(new TransportResponse().SetStaticConfigChanged(configData)));
            }

            Thread.Sleep(100);
            // ид для ограничивающей очереди сообщений с агентов
            var queueId = messageHeaders.GetAgentId();

            // нужно прийти позже (или нужно добавить в обработку)
            if (!this.queueManager.TryAccept(queueId, new ThrottleParams
            {
                Attempt = messageHeaders.Attempt,
            }, out var onFailOptions))
            {
                // http status code 429 - The user has sent too many requests in a given amount of time ("rate limiting").
                //var retryAfterMs = onFailOptions.WaitOnFailTimeout.TotalMilliseconds;
                var retryAfterMs = 2 * 1000;
                this.Response.Headers.Add("Retry-After", retryAfterMs.ToString());
                // workaround !! для корректной работы не убираем контент из ответа
                // https://github.com/dotnet/corefx/blob/v2.1.5/src/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/HttpConnection.cs#L537  (версия 2.1.5 указана для примера)
                return(this.StatusCode(429, "too many requests, retry after timeout"));
            }

            try
            {
                // TODO при перезагрузке токена не возникнут ли зависоны??
                var processingCtx = this.GetProcessingContext(messageHeaders, configData);

                // обрабатываем
                return(await this.ProcessMessage(processingCtx));
            }
            finally
            {
                this.queueManager.Release(queueId);
            }
        }
Exemple #2
0
        public async Task <IActionResult> Exchange()
        {
            // получаем информацию заголовков (по ним мы как правило можем определить нужно ли получать тело)
            var messageHeaders = packageRequestParser.GetHeaders(this.Request);

            // вначале получим и проверим статическую конфигурацию
            // TODO при перезагрузке конфига и токена не возникнут ли зависоны??
            var configData = this.GetCurrentConfigData(messageHeaders);

            // если поменялась "статическая" конфигурация, то не принимаем информацию, а просим агента сходить за новой и применить её
            // статическую конфигурацию обрабатываем отдельно, чтобы была возможность отключить часть функционала на агенте, без отрабатывания сообщений с агента
            if (messageHeaders.ConfigToken != configData.ConfigToken)
            {
                return(this.Ok(new TransportResponse().SetStaticConfigChanged(configData)));
            }

            // ид для ограничивающей очереди сообщений с агентов
            var queueId = messageHeaders.GetAgentId();

            // нужно прийти позже (или нужно добавить в обработку)
            if (!this.queueManager.TryAccept(queueId, new ThrottleParams
            {
                Attempt = messageHeaders.Attempt,
            }))
            {
                // http status code 429 - The user has sent too many requests in a given amount of time ("rate limiting").
                var retryAfterMs = 36 * 1000;
                this.Response.Headers.Add("Retry-After", retryAfterMs.ToString());
                return(this.StatusCode(429));
            }

            try
            {
                // TODO при перезагрузке токена не возникнут ли зависоны??
                var processingCtx = this.GetProcessingContext(messageHeaders, configData);

                // обрабатываем
                return(await this.ProcessMessage(processingCtx));
            }
            finally
            {
                this.queueManager.Release(queueId);
            }
        }