/// <summary>
        /// Performs the invalidation if the request has an <see cref="InvalidateCachedInstancesOfAttribute"/> attribute.
        /// </summary>
        public void Intercept(IColomboRequestHandleInvocation nextInvocation)
        {
            var invalidateCachedInstancesOfAttributes = nextInvocation.Request.GetCustomAttributes<InvalidateCachedInstancesOfAttribute>();
            foreach (var invalidateCachedInstancesOfAttribute in invalidateCachedInstancesOfAttributes)
            {
                foreach (var responseType in invalidateCachedInstancesOfAttribute.ResponsesTypes)
                {
                    string cacheSegment = null;
                    var cacheSegmentAttribute = nextInvocation.Request.GetCustomAttribute<CacheSegmentAttribute>();
                    if (cacheSegmentAttribute != null)
                        cacheSegment = cacheSegmentAttribute.GetCacheSegment(nextInvocation.Request);

                    Logger.DebugFormat("Invalidating all responses of type {0} from cache segment {1}", responseType, cacheSegment);
                    cache.Flush(cacheSegment, responseType);
                }
            }

            nextInvocation.Proceed();

            var enableClientCachingAttribute = nextInvocation.Request.GetCustomAttribute<EnableCacheAttribute>();
            if (enableClientCachingAttribute == null) return;

            var cacheKey = nextInvocation.Request.GetCacheKey();

            string cacheSegmentAfter = null;
            var cacheSegmentAttributeAfter = nextInvocation.Request.GetCustomAttribute<CacheSegmentAttribute>();
            if (cacheSegmentAttributeAfter != null)
                cacheSegmentAfter = cacheSegmentAttributeAfter.GetCacheSegment(nextInvocation.Request);

            Logger.DebugFormat("Caching {0} in segment {1} with cacheKey {2} for {3}", nextInvocation.Request, cacheSegmentAfter, cacheKey, enableClientCachingAttribute.Duration);
            cache.Store(cacheSegmentAfter, cacheKey, nextInvocation.Response, enableClientCachingAttribute.Duration);
        }
        /// <summary>
        /// Monitor the performance.
        /// </summary>
        public void Intercept(IColomboRequestHandleInvocation invocation)
        {
            if (invocation == null) throw new ArgumentNullException("invocation");
            Contract.EndContractBlock();

            var watch = new Stopwatch();
            watch.Start();
            invocation.Proceed();
            watch.Stop();

            try
            {
                var instanceName = invocation.Request.GetGroupName();

                using (var numberOfRequestsHandled = PerfCounterFactory.GetPerfCounter(PerfCounter.NumRequestsHandled, instanceName))
                    numberOfRequestsHandled.Increment();

                using (var numberOfRequestsHandledPerSec = PerfCounterFactory.GetPerfCounter(PerfCounter.NumRequestsHandledPerSec, instanceName))
                    numberOfRequestsHandledPerSec.Increment();

                using (var averageDurationForRequestHandling = PerfCounterFactory.GetPerfCounter(PerfCounter.AverageDurationForRequestHandling, instanceName))
                    averageDurationForRequestHandling.IncrementBy(watch.ElapsedTicks);

                using (var averageDurationForRequestHandlingBase = PerfCounterFactory.GetPerfCounter(PerfCounter.AverageDurationForRequestHandlingBase, instanceName))
                    averageDurationForRequestHandlingBase.Increment();
            }
            catch (Exception ex)
            {
                Logger.Warn("Error while computing performance counters values.", ex);
            }
        }
        public RequestHandlerHandleInterceptorInvocation(IRequestHandlerHandleInterceptor interceptor, IColomboRequestHandleInvocation nextInvocation)
        {
            if (interceptor == null) throw new ArgumentNullException("interceptor");
            if (nextInvocation == null) throw new ArgumentNullException("nextInvocation");
            Contract.EndContractBlock();

            this.interceptor = interceptor;
            this.nextInvocation = nextInvocation;
        }
 public void Intercept(IColomboRequestHandleInvocation nextInvocation)
 {
     try
     {
         nextInvocation.Proceed();
     }
     catch (Exception ex)
     {
         try
         {
             var alert = new ExceptionAlert(new[] { nextInvocation.Request }, ex);
             Logger.Warn(alert.ToString());
             foreach (var alerter in Alerters)
                 alerter.Alert(alert);
         }
         catch
         {
         }
         throw;
     }
 }