private async Task <JObject> GetEntity(string entityId, ContentHubConnectionPolicy contentHubPolicy)
        {
            var request = WebRequest.Create($"{contentHubPolicy.ProtocolAndHost}/api/entities/{entityId}");

            request.Method = "GET";
            var token = await GetToken(contentHubPolicy).ConfigureAwait(false);

            request.Headers.Add("X-Auth-Token", token);

            string responseContent = null;

            using (var response = request.GetResponse())
            {
                using (var responseStream = response.GetResponseStream())
                {
                    using (var streamReader = new StreamReader(responseStream))
                    {
                        responseContent = streamReader.ReadToEnd();
                    }
                }
            }
            if (!string.IsNullOrEmpty(responseContent))
            {
                return(JObject.Parse(responseContent));
            }

            return(null);
        }
        private async Task <string> GetToken(ContentHubConnectionPolicy contentHubPolicy)
        {
            var cache = _cacheManager.GetCache(contentHubPolicy.TokenCacheName);

            if (cache == null)
            {
                cache = _cacheManager.CreateCache(contentHubPolicy.TokenCacheName);
            }

            var securityToken = await cache.Get <string>(TOKEN_NAME).ConfigureAwait(false);

            if (string.IsNullOrEmpty(securityToken))
            {
                var request = WebRequest.Create(string.Format("{0}/api/authenticate", contentHubPolicy.ProtocolAndHost));
                request.Method      = "POST";
                request.ContentType = "application/json";

                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                    var jsonObject = new
                    {
                        user_name        = contentHubPolicy.UserName,
                        password         = contentHubPolicy.Password,
                        discard_existing = false
                    };

                    streamWriter.Write(JsonConvert.SerializeObject(jsonObject));
                    streamWriter.Flush();
                    streamWriter.Close();
                }

                string responseContent = null;
                using (var response = request.GetResponse())
                {
                    using (var responseStream = response.GetResponseStream())
                    {
                        using (var streamReader = new StreamReader(responseStream))
                        {
                            responseContent = streamReader.ReadToEnd();
                        }
                    }
                }

                var o = JObject.Parse(responseContent);
                securityToken = (string)o["token"];

                await cache.SetString(TOKEN_NAME, securityToken).ConfigureAwait(false);
            }

            return(securityToken);
        }