public static List<WebApiUserCacheData> Data()
		{
			var data = HttpRuntime.Cache[Key] as List<WebApiUserCacheData>;
			if (data == null)
			{
				lock (_lock)
				{
					data = HttpRuntime.Cache[Key] as List<WebApiUserCacheData>;

					if (data == null)
					{
						var engine = EngineContext.Current;
						var genericAttributes = engine.Resolve<IRepository<GenericAttribute>>();
						var customers = engine.Resolve<IRepository<Customer>>();

						var attributes = (
							from a in genericAttributes.Table
							join c in customers.Table on a.EntityId equals c.Id
							where !c.Deleted && c.Active && a.KeyGroup == "Customer" && a.Key == Key
							select new
							{
								a.Id,
								a.EntityId,
								a.Value
							}).ToList();

						data = new List<WebApiUserCacheData>();

						foreach (var attribute in attributes)
						{
							if (!string.IsNullOrWhiteSpace(attribute.Value) && !data.Exists(x => x.CustomerId == attribute.EntityId))
							{
								string[] arr = attribute.Value.SplitSafe("¶");

								if (arr.Length > 2)
								{
									var apiUser = new WebApiUserCacheData
									{
										GenericAttributeId = attribute.Id,
										CustomerId = attribute.EntityId,
										Enabled = bool.Parse(arr[0]),
										PublicKey = arr[1],
										SecretKey = arr[2]
									};

									if (arr.Length > 3)
										apiUser.LastRequest = DateTime.ParseExact(arr[3], "o", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);

									if (apiUser.IsValid)
										data.Add(apiUser);
								}
							}
						}

						HttpRuntime.Cache.Add(Key, data, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable,
							new CacheItemRemovedCallback(OnDataRemoved));
					}
				}
			}
			return data;
		}
        public static List <WebApiUserCacheData> Data()
        {
            var data = HttpRuntime.Cache[Key] as List <WebApiUserCacheData>;

            if (data == null)
            {
                lock (_lock)
                {
                    data = HttpRuntime.Cache[Key] as List <WebApiUserCacheData>;

                    if (data == null)
                    {
                        var engine            = EngineContext.Current;
                        var genericAttributes = engine.Resolve <IRepository <GenericAttribute> >();
                        var customers         = engine.Resolve <IRepository <Customer> >();

                        var attributes = (
                            from a in genericAttributes.Table
                            join c in customers.Table on a.EntityId equals c.Id
                            where !c.Deleted && c.Active && a.KeyGroup == "Customer" && a.Key == Key
                            select new
                        {
                            a.Id,
                            a.EntityId,
                            a.Value
                        }).ToList();

                        data = new List <WebApiUserCacheData>();

                        foreach (var attribute in attributes)
                        {
                            if (!string.IsNullOrWhiteSpace(attribute.Value) && !data.Exists(x => x.CustomerId == attribute.EntityId))
                            {
                                string[] arr = attribute.Value.SplitSafe("¶");

                                if (arr.Length > 2)
                                {
                                    var apiUser = new WebApiUserCacheData
                                    {
                                        GenericAttributeId = attribute.Id,
                                        CustomerId         = attribute.EntityId,
                                        Enabled            = bool.Parse(arr[0]),
                                        PublicKey          = arr[1],
                                        SecretKey          = arr[2]
                                    };

                                    if (arr.Length > 3)
                                    {
                                        apiUser.LastRequest = DateTime.ParseExact(arr[3], "o", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal);
                                    }

                                    if (apiUser.IsValid)
                                    {
                                        data.Add(apiUser);
                                    }
                                }
                            }
                        }

                        HttpRuntime.Cache.Add(Key, data, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable,
                                              new CacheItemRemovedCallback(OnDataRemoved));
                    }
                }
            }
            return(data);
        }
		public bool CreateKeys(int customerId)
		{
			if (customerId != 0)
			{
				var hmac = new HmacAuthentication();
				var userData = WebApiCachingUserData.Data();
				string key1, key2;

				for (int i = 0; i < 9999; ++i)
				{
					if (hmac.CreateKeys(out key1, out key2) && !userData.Exists(x => x.PublicKey.IsCaseInsensitiveEqual(key1)))
					{
						var apiUser = new WebApiUserCacheData
						{
							CustomerId = customerId,
							PublicKey = key1,
							SecretKey = key2,
							Enabled = true
						};

						RemoveKeys(customerId);

						var attribute = new GenericAttribute
						{
							EntityId = customerId,
							KeyGroup = "Customer",
							Key = WebApiCachingUserData.Key,
							Value = apiUser.ToString()
						};

						_genericAttributeService.InsertAttribute(attribute);

						WebApiCachingUserData.Remove();
						return true;
					}
				}
			}
			return false;
		}