public void BeforeInvoke(InvocationContext invocationContext)
        {
            _memoryCacheAttribute = invocationContext.GetAttributeFromMethod<MemoryCacheAttribute>();
            var cacheKey = _memoryCacheAttribute.CacheKey;
            var cacheConfig = _cacheConfigFactory.Config[cacheKey];
            if (cacheConfig.Enabled)
            {
                if (!string.IsNullOrWhiteSpace(_memoryCacheAttribute.CacheKeyParameterSubstitutions))
                {
                    List<object> paramValues = new List<object>();
                    string[] paramNames = _memoryCacheAttribute.CacheKeyParameterSubstitutions.Split(",", StringSplitOptions.RemoveEmptyEntries);
                    foreach (string paramName in paramNames)
                    {
                        paramValues.Add(invocationContext.GetParameterValue(paramName.Trim()));

                    }
                    cacheKey = string.Format(cacheConfig.CacheKey.ToString(), paramValues.ToArray());

                }
                CacheKey = cacheKey;

                if (_memoryCacheAttribute.RefreshCache)
                {
                    _memoryCacheService.Remove(CacheKey);
                }

                var cacheReturnObj = RetrieveCacheEntry(invocationContext, CacheKey);
                if (cacheReturnObj != null && cacheReturnObj.CacheEntry != null)
                {
                    var returnType = invocationContext.GetMethodReturnType();
                    var isAsyncMethod = returnType != null && returnType.IsGenericType &&
                        returnType.GetGenericTypeDefinition() == typeof(Task<>);
                    if (isAsyncMethod)
                    {
                        invocationContext.OverrideAsyncMethodReturnValue(cacheReturnObj.CacheEntry);
                    }
                    else
                    {
                        invocationContext.OverrideMethodReturnValue(cacheReturnObj.CacheEntry);
                    }

                    invocationContext.TempData[CacheConstants.LOGGING_CACHE_INVOCATIONCONETXT] = string.Format(
                        "{0}{1}{2}", CacheConstants.LOGGING_CACHE_HIT, CacheConstants.LOGGING_CACHE_DELIMITER, cacheKey);
                    invocationContext.BypassInvocation();
                }
                else
                {
                    invocationContext.TempData[CacheConstants.LOGGING_CACHE_INVOCATIONCONETXT] = string.Format(
                           "{0}{1}{2}", CacheConstants.LOGGING_CACHE_MISS, CacheConstants.LOGGING_CACHE_DELIMITER, cacheKey);
                }

            }
        }
 private CacheReturnModel RetrieveCacheEntry(InvocationContext invocationContext, string key)
 {
     var cacheReturnObj = new CacheReturnModel();
     try
     {
         var returnType = invocationContext.GetMethodReturnType();
         cacheReturnObj.CacheEntry = IsReturnTypeGenericCollection(returnType) ?
             RetrieveCollectionFromCache(key, returnType) :
             _memoryCacheService.Get(key);
     }
     catch (Exception ex)
     {
         cacheReturnObj.CacheContext = CreateCacheExceptionInfoMessage(key, ex);
     }
     return cacheReturnObj;
 }