Пример #1
0
        public async Task Invoke(HttpContext context)
        {
            if (context.Request.Path != _options.Path)
            {
                await _next(context);

                return;
            }

            if (_options.AuthorizationPolicy != null)
            {
                var principal = await SecurityHelper.GetUserPrincipal(context, _options.AuthorizationPolicy);

                if (!await _authorizationService.AuthorizeAsync(principal, context, _options.AuthorizationPolicy))
                {
                    _logger.AuthorizationFailed();
                    await _next(context);

                    return;
                }
            }

            var response = context.Response;

            // Canary response must not be cached
            response.Headers[HeaderNames.CacheControl] = "no-cache";
            response.Headers[HeaderNames.Pragma]       = "no-cache";
            response.Headers[HeaderNames.Expires]      = "-1";
            var serverSwitchContext = new ServerSwitchContext(context);
            await _serverSwitch?.CheckServerStateAsync(serverSwitchContext);

            if (serverSwitchContext.ServerDisabled)
            {
                _logger.ServerDisabled();
                response.StatusCode = StatusCodes.Status503ServiceUnavailable;
                response.WriteRetryAfterHeader(serverSwitchContext.RetryAfter);
            }
            else if (_options.EnableHealthCheck)
            {
                var healthCheckResponse = await _healthService.CheckHealthAsync(_defaultPolicy);

                if (healthCheckResponse.HasCriticalErrors)
                {
                    _logger.CanaryFailed(healthCheckResponse.Errors);
                    response.StatusCode = StatusCodes.Status503ServiceUnavailable;
                    response.WriteRetryAfterHeader(healthCheckResponse.RetryAfter);
                }
                else
                {
                    _logger.CanarySucceeded();
                    response.StatusCode = StatusCodes.Status200OK;
                }
            }
        }
Пример #2
0
        public Task CheckServerStateAsync(ServerSwitchContext context)
        {
            if (_fileExists)
            {
                context.Disable(_options.RetryDelay);
            }
            else
            {
                context.Enable();
            }

            return(TaskCache.CompletedTask);
        }