Exemple #1
0
        public override async Task <HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
        {
            if (ForceClusterAwareness == false)
            {
                var  clusterAwareHeader = GetClusterHeader(controllerContext, Constants.Cluster.ClusterAwareHeader);
                bool clusterAware;
                if (clusterAwareHeader == null || bool.TryParse(clusterAwareHeader, out clusterAware) == false || clusterAware == false)
                {
                    return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false));
                }
            }

            InnerInitialization(controllerContext);

            if (CounterStorage == null || ClusterManager.IsActive() == false)
            {
                return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false));
            }

            if (CountersName != null && await CountersLandlord.GetResourceInternal(CountersName).ConfigureAwait(false) == null)
            {
                var msg = "Could not find a counter named: " + CountersName;
                return(GetMessageWithObject(new { Error = msg }, HttpStatusCode.ServiceUnavailable));
            }

            if (CounterStorage.IsClusterDatabase() == false)
            {
                return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false));
            }

            if (ClusterManager.IsLeader())
            {
                return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false));
            }

            if (IsReadRequest(controllerContext))
            {
                var clusterReadBehaviorHeader = GetClusterHeader(controllerContext, Constants.Cluster.ClusterReadBehaviorHeader);
                if (string.Equals(clusterReadBehaviorHeader, "All", StringComparison.OrdinalIgnoreCase))
                {
                    return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false));
                }
            }

            var  clusterFailoverBehaviorHeader = GetClusterHeader(controllerContext, Constants.Cluster.ClusterFailoverBehaviorHeader);
            bool clusterFailoverBehavior;

            if (bool.TryParse(clusterFailoverBehaviorHeader, out clusterFailoverBehavior) && clusterFailoverBehavior)
            {
                return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false));
            }

            return(RedirectToLeader(controllerContext.Request));
        }