/// <summary>
        /// checks if login to backend specified by <paramref name="bobId"/> works using the token
        /// </summary>
        /// <param name="token">JWToken</param>
        /// <param name="apiKey">hf-api api key</param>
        /// <param name="bobId">ID of backend</param>
        /// <returns>Tuple containing true/false depending if login was successful and returned status code</returns>
        public async Task <Tuple <bool, HttpStatusCode> > CheckLogin(Uri meterMonitorBaseUrl, string token, string apiKey, BOBackendId bobId)
        {
            if (meterMonitorBaseUrl == null)
            {
                throw new ArgumentNullException(nameof(meterMonitorBaseUrl), "could not be null.");
            }
            if (bobId == null)
            {
                throw new ArgumentNullException(nameof(bobId), "could not be null.");
            }
            var request = new HttpRequestMessage()
            {
                Method     = HttpMethod.Head,
                RequestUri = meterMonitorBaseUrl
            };

            AddHeaders(ref request, token, apiKey, bobId);
            HttpResponseMessage response;

            try
            {
                response = await httpClient.SendAsync(request);
            }
            catch (Exception e)
            {
                _logger.LogError($"Request (try login) failed. {nameof(meterMonitorBaseUrl)}: '{meterMonitorBaseUrl}', {nameof(token)}: '{token}', {nameof(bobId)}: '{bobId}'; Exception: {e}.");
                _logger.LogInformation($"Returning negative result with status code {HttpStatusCode.BadGateway} / 502");
                return(new Tuple <bool, HttpStatusCode>(false, HttpStatusCode.BadGateway));
            }
            finally
            {
                request.Dispose();
            }
            _logger.LogDebug($"Response has status code {response.StatusCode}. See lookup service logs for details.");
            return(new Tuple <bool, HttpStatusCode>(response.IsSuccessStatusCode, response.StatusCode));
        }
        /// <summary>
        /// Get MeterMonitor By Id
        /// </summary>
        /// <param name="internalPodId">internalPodId as a part of key</param>
        /// <param name="logikzw">logikzw as a part of key</param>
        /// <param name="profile">profile as a part of key</param>
        /// <param name="profileRole">profileRole as a part of key</param>
        /// <param name="serviceid">serviceid as a part of key</param>
        /// <param name="token">token to authenticate</param>
        /// <param name="apiKey">API key for gateway</param>
        /// <param name="backendId">ID of Backend</param>
        /// <param name="withError">with 'toError'?</param>
        /// <returns></returns>
        ///<exception cref="HfException" >if Could not get the MeterMonitor and silentFailure is false</exception>
        public async Task <MeterMonitorResult> GetMeterMonitorById(
            string internalPodId,
            string logikzw,
            string profile,
            string profileRole,
            string serviceid,
            string token, string apiKey, BOBackendId backendId, bool withError = true)
        {
            using (MiniProfiler.Current.Step(nameof(GetMeterMonitorById)))
            {
                if (string.IsNullOrEmpty(internalPodId))
                {
                    _logger.LogError($"{nameof(internalPodId)} could not be null in {nameof(MeterMonitorHelper)}{nameof(GetMeterMonitorById)}");
                    throw new ArgumentNullException(internalPodId, $"{nameof(internalPodId)} could not be null in {nameof(MeterMonitorHelper)}{nameof(GetMeterMonitorById)}");
                }
                if (string.IsNullOrEmpty(logikzw))
                {
                    _logger.LogError($"{nameof(logikzw)} could not be null in {nameof(MeterMonitorHelper)}{nameof(GetMeterMonitorById)}");
                    throw new ArgumentNullException(logikzw, $"{nameof(logikzw)} could not be null in {nameof(MeterMonitorHelper)}{nameof(GetMeterMonitorById)}");
                }
                if (string.IsNullOrEmpty(profile))
                {
                    _logger.LogError($"{nameof(profile)} could not be null in {nameof(MeterMonitorHelper)}{nameof(GetMeterMonitorById)}");
                    throw new ArgumentNullException(profile, $"{nameof(profile)} could not be null in {nameof(MeterMonitorHelper)}{nameof(GetMeterMonitorById)}");
                }
                if (string.IsNullOrEmpty(profileRole))
                {
                    _logger.LogError($"{nameof(profileRole)} could not be null in {nameof(MeterMonitorHelper)}{nameof(GetMeterMonitorById)}");
                    throw new ArgumentNullException(profileRole, $"{nameof(profileRole)} could not be null in {nameof(MeterMonitorHelper)}{nameof(GetMeterMonitorById)}");
                }
                if (string.IsNullOrEmpty(serviceid))
                {
                    _logger.LogError($"{nameof(serviceid)} could not be null in {nameof(MeterMonitorHelper)}{nameof(GetMeterMonitorById)}");
                    throw new ArgumentNullException(serviceid, $"{nameof(serviceid)} could not be null in {nameof(MeterMonitorHelper)}{nameof(GetMeterMonitorById)}");
                }
                Dictionary <string, string> queries = new Dictionary <string, string>();
                queries.Add(nameof(internalPodId), internalPodId);
                queries.Add(nameof(logikzw), logikzw);
                queries.Add(nameof(profile), profile);
                queries.Add(nameof(profileRole), profileRole);
                queries.Add(nameof(serviceid), serviceid);
                queries.Add(nameof(withError), withError.ToString());

                HttpRequestMessage request = new HttpRequestMessage()
                {
                    Method     = HttpMethod.Get,
                    RequestUri = new Uri(QueryHelpers.AddQueryString("getbyid", queries), UriKind.Relative)
                };
                AddHeaders(ref request, token, apiKey, backendId);
                _logger.LogInformation($"Sending out MeterMonitor GetbyId request with token");
                var responseMessage = await httpClient.SendAsync(request);

                _logger.LogInformation($"Got response from MeterMonitor GetbyId request with token");
                if (!responseMessage.IsSuccessStatusCode)
                {
                    string response = await responseMessage.Content.ReadAsStringAsync();

                    _logger.LogCritical($"Could not perform MeterMonitor GetbyId: {responseMessage.ReasonPhrase} / {response}; GET to {httpClient.BaseAddress}{request.RequestUri}");
                    if (_silentFailure)
                    {
                        return(null);
                    }
                    else
                    {
                        throw new HfException(responseMessage);
                    }
                }
                _logger.LogDebug($"Successfully retrieved MeterMonitor GetbyId response with status code {responseMessage.StatusCode}");
                string responseContent = await responseMessage.Content.ReadAsStringAsync();

                var resultObject = DeserializeObjectAndLog <MeterMonitorResult>(responseContent);
                return(resultObject);
            }
        }
 /// <summary>
 /// set requests headers and removes them prior to adding if they're already present.
 /// </summary>
 /// <param name="request">request that is modified (pass by ref)</param>
 /// <param name="token">access token</param>
 /// <param name="apiKey">subscription key for azure</param>
 /// <param name="backendId">ID of the backend</param>
 /// <returns></returns>
 protected void AddHeaders(ref HttpRequestMessage request, string token, string apiKey, BOBackendId backendId)
 {
     _logger.LogDebug(nameof(AddHeaders));
     if (request.Headers.Contains(HeaderNames.Auth.Authorization))
     {
         _logger.LogDebug($"Removing header '{HeaderNames.Auth.Authorization}'");
         request.Headers.Remove(HeaderNames.Auth.Authorization);
     }
     request.Headers.Add(HeaderNames.Auth.Authorization, "Bearer " + token);
     if (request.Headers.Contains(HeaderNames.Auth.HfAuthorization))
     {
         _logger.LogDebug($"Removing header '{HeaderNames.Auth.HfAuthorization}'");
         request.Headers.Remove(HeaderNames.Auth.HfAuthorization);
     }
     request.Headers.Add(HeaderNames.Auth.HfAuthorization, "Bearer " + token);
     if (request.Headers.Contains(HeaderNames.Azure.SUBSCRIPTION_KEY))
     {
         _logger.LogDebug($"Removing header '{HeaderNames.Azure.SUBSCRIPTION_KEY}'");
         request.Headers.Remove(HeaderNames.Azure.SUBSCRIPTION_KEY);
     }
     if (!string.IsNullOrEmpty(apiKey))
     {
         _logger.LogDebug($"Adding header '{HeaderNames.Azure.SUBSCRIPTION_KEY}'");
         request.Headers.Add(HeaderNames.Azure.SUBSCRIPTION_KEY, apiKey);
     }
     if (request.Headers.Contains(HeaderNames.BACKEND_ID))
     {
         _logger.LogDebug($"Removing header '{HeaderNames.BACKEND_ID}'");
         request.Headers.Remove(HeaderNames.BACKEND_ID);
     }
     _logger.LogDebug($"Adding header '{HeaderNames.BACKEND_ID}'");
     request.Headers.Add(HeaderNames.BACKEND_ID, backendId.ToString());
     _logger.LogDebug($"Adding header 'Accept-Encoding'");
     request.Headers.Add("Accept-Encoding", "gzip, deflate");
 }
示例#4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="urls"></param>
        /// <param name="lookupURL"></param>
        /// <param name="clientCertString"></param>
        /// <param name="apiKey"></param>
        /// <param name="backendId"></param>
        /// <returns></returns>
        /// <exception cref="HfException" >if Could not perform lookup and silentFailure is false</exception>

        public async Task <GenericLookupResult> RetrieveURLs(IList <Bo4eUri> urls, Uri lookupURL, string clientCertString, string apiKey, BOBackendId backendId, string correlationId = null)
        {
            if (string.IsNullOrWhiteSpace(clientCertString))
            {
                _logger.LogWarning($"{nameof(clientCertString)} is initial: '{clientCertString}'");
            }
            if (lookupURL == null)
            {
                _logger.LogCritical($"{nameof(lookupURL)} is null!");
            }

            GenericLookupQuery urlObject = new GenericLookupQuery()
            {
                Uris = urls
            };
            string requestBody = JsonConvert.SerializeObject(urlObject, new StringEnumConverter());
            var    request     = new HttpRequestMessage()
            {
                Content    = new StringContent(requestBody, System.Text.UTF8Encoding.UTF8, MIME_TYPE_JSON),
                RequestUri = lookupURL,
                Method     = HttpMethod.Post
            };

            if (request.Headers.Contains(HeaderNames.Auth.XArrClientCert))
            {
                _logger.LogDebug($"Removing header '{HeaderNames.Auth.XArrClientCert}'");
                request.Headers.Remove(HeaderNames.Auth.XArrClientCert);
            }

            request.Headers.Add(HeaderNames.Auth.XArrClientCert, clientCertString);
            if (request.Headers.Contains(HeaderNames.Azure.SUBSCRIPTION_KEY))
            {
                _logger.LogDebug($"Removing header '{HeaderNames.Azure.SUBSCRIPTION_KEY}'");
                request.Headers.Remove(HeaderNames.Azure.SUBSCRIPTION_KEY);
            }
            if (!string.IsNullOrEmpty(apiKey))
            {
                _logger.LogDebug($"Adding {HeaderNames.Azure.SUBSCRIPTION_KEY} header");
                request.Headers.Add(HeaderNames.Azure.SUBSCRIPTION_KEY, apiKey);
            }
            else
            {
                _logger.LogWarning($"{nameof(apiKey)} is initial: '{apiKey}'");
            }
            if (request.Headers.Contains(HeaderNames.BACKEND_ID))
            {
                _logger.LogDebug($"Removing {HeaderNames.BACKEND_ID} header");
                request.Headers.Remove(HeaderNames.BACKEND_ID);
            }
            request.Headers.Add(HeaderNames.BACKEND_ID, backendId.ToString());

            if (request.Headers.Contains("x-correlation-id"))
            {
                _logger.LogDebug($"Removing header 'x-correlation-id'");
                request.Headers.Remove("x-correlation-id");
            }
            if (!string.IsNullOrEmpty(correlationId))
            {
                _logger.LogDebug($"Adding x-correlation-id header");
                request.Headers.Add("x-correlation-id", correlationId);
            }

            var responseMessage = await httpClient.SendAsync(request);

            if (!responseMessage.IsSuccessStatusCode)
            {
                string responseContentPost = await responseMessage.Content.ReadAsStringAsync();

                _logger.LogCritical($"Could not perform lookup: {responseMessage.ReasonPhrase} / {responseContentPost}; The original request was: {requestBody} POSTed to {lookupURL}");
                if (_silentFailure)
                {
                    return(null);
                }
                else
                {
                    throw new HfException(responseMessage);
                }
            }

            string responseContent = await responseMessage.Content.ReadAsStringAsync();

            GenericLookupResult resultObject = DeserializeObjectAndLog <GenericLookupResult>(responseContent);

            return(resultObject);
        }
        /// <summary>
        /// GetMeterMonitor list
        /// Posts the content from <paramref name="json"/> to the URL specified in <paramref name="lookupURL"/> using the token
        /// </summary>
        /// <param name="token">token to authenticate</param>
        /// <param name="apiKey">API key for gateway</param>
        /// <param name="backendId">ID of Backend</param>
        /// <param name="limit">limit number of results</param>
        /// <param name="offset">number of skip results</param>
        /// <param name="withError">with 'toError'?</param>
        /// <param name="createdDate">specific Date to filter results</param>
        /// <returns>a list of MeterMonitorResult <see cref="MeterMonitorResult"/>></returns>
        ///<exception cref="HfException" >if Could not get the MeterMonitor list and silentFailure is false</exception>
        public async Task <IList <MeterMonitorResult> > GetMeterMonitors(string token, string apiKey, BOBackendId backendId,
                                                                         DateTimeOffset?createdDate = null, uint limit = 0, uint offset = 0, bool withError = true)
        {
            using (MiniProfiler.Current.Step(nameof(GetMeterMonitors)))
            {
                Dictionary <string, string> queries = new Dictionary <string, string>();
                if (limit > 0)
                {
                    queries.Add(nameof(limit), limit.ToString());
                }
                if (offset > 0)
                {
                    queries.Add(nameof(offset), offset.ToString());
                }
                queries.Add(nameof(withError), withError.ToString());
                string createdDateString = createdDate.HasValue ? createdDate.Value.ToString("yyyy-MM-dd") : DateTimeOffset.UtcNow.ToString("yyyy-MM-dd");
                queries.Add(nameof(createdDate), createdDateString);
                _logger.LogInformation($"MeterMonitor List request with createdDate: '{createdDateString}'");

                HttpRequestMessage request = new HttpRequestMessage()
                {
                    Method     = HttpMethod.Get,
                    RequestUri = new Uri(QueryHelpers.AddQueryString("", queries), UriKind.Relative)
                };
                AddHeaders(ref request, token, apiKey, backendId);
                _logger.LogInformation($"Sending out MeterMonitor List request with token");

                var responseMessage = await httpClient.SendAsync(request);

                _logger.LogInformation($"Got response from MeterMonitor List request with token");
                if (!responseMessage.IsSuccessStatusCode)
                {
                    string response = await responseMessage.Content.ReadAsStringAsync();

                    _logger.LogCritical($"Could not perform MeterMonitor List: {responseMessage.ReasonPhrase} / {response}; GET to {httpClient.BaseAddress}");
                    if (_silentFailure)
                    {
                        return(null);
                    }
                    else
                    {
                        throw new HfException(responseMessage);
                    }
                }
                _logger.LogDebug($"Successfully retrieved MeterMonitor List response with status code {responseMessage.StatusCode}");
                string responseContent = await responseMessage.Content.ReadAsStringAsync();

                var resultObject = DeserializeObjectAndLog <List <MeterMonitorResult> >(responseContent);
                return(resultObject);
            }
        }
示例#6
0
        /// <summary>
        /// set requests headers and removes them prior to adding if they're already present.
        /// </summary>
        /// <param name="request">request that is modified (pass by ref)</param>
        /// <param name="token">access token</param>
        /// <param name="apiKey">subscription key for azure</param>
        /// <param name="backendId">ID of the backend</param>
        /// <returns></returns>
        protected void AddHeaders(ref HttpRequestMessage request, string token, string apiKey, BOBackendId backendId, string correlationId)
        {
            _logger.LogDebug(nameof(AddHeaders));
            if (request.Headers.Contains(HeaderNames.Auth.Authorization))
            {
                _logger.LogDebug($"Removing header '{HeaderNames.Auth.Authorization}'");
                request.Headers.Remove(HeaderNames.Auth.Authorization);
            }
            request.Headers.Add(HeaderNames.Auth.Authorization, "Bearer " + token);
            if (request.Headers.Contains(HeaderNames.Auth.HfAuthorization))
            {
                _logger.LogDebug($"Removing header '{HeaderNames.Auth.HfAuthorization}'");
                request.Headers.Remove(HeaderNames.Auth.HfAuthorization);
            }
            request.Headers.Add(HeaderNames.Auth.HfAuthorization, "Bearer " + token);
            if (request.Headers.Contains(HeaderNames.Azure.SUBSCRIPTION_KEY))
            {
                _logger.LogDebug($"Removing header '{HeaderNames.Azure.SUBSCRIPTION_KEY}'");
                request.Headers.Remove(HeaderNames.Azure.SUBSCRIPTION_KEY);
            }
            if (!string.IsNullOrEmpty(apiKey))
            {
                _logger.LogDebug($"Adding header '{HeaderNames.Azure.SUBSCRIPTION_KEY}'");
                request.Headers.Add(HeaderNames.Azure.SUBSCRIPTION_KEY, apiKey);
            }
            if (request.Headers.Contains(HeaderNames.BACKEND_ID))
            {
                _logger.LogDebug($"Removing header '{HeaderNames.BACKEND_ID}'");
                request.Headers.Remove(HeaderNames.BACKEND_ID);
            }
            _logger.LogDebug($"Adding header '{HeaderNames.BACKEND_ID}'");
            request.Headers.Add(HeaderNames.BACKEND_ID, backendId.ToString());

            if (request.Headers.Contains("x-correlation-id"))
            {
                _logger.LogDebug($"Removing header 'x-correlation-id'");
                request.Headers.Remove("x-correlation-id");
            }
            if (!string.IsNullOrEmpty(correlationId))
            {
                _logger.LogDebug($"Adding x-correlation-id header");
                request.Headers.Add("x-correlation-id", correlationId);
            }
        }
示例#7
0
        /// <summary>
        /// Initialise the suggestion cache for Backend <paramref name="bobId"/> with the lookup result of <paramref name="initialisationQuery"/>
        /// </summary>
        /// <param name="initialisationQuery">query whose result is used to initialise the suggestion cache</param>
        /// <param name="lookupUrl">URI of the lookup service</param>
        /// <param name="token">auth token</param>
        /// <param name="apiKey">api key for azure</param>
        /// <param name="bobId">unique ID of the backend</param>
        /// <returns>raw lookup response as string in case of success, null in case of failure</returns>
        /// <exception cref="HfException" >if Could not perform lookup and silentFailure is false</exception>
        public async Task <string> InitialiseSuggestionCache(GenericCachingQuery initialisationQuery, Uri cacheUrl, string token, string apiKey, string encryptionKey, BOBackendId bobId, string correlationId = null)
        {
            using (MiniProfiler.Current.Step($"{nameof(InitialiseSuggestionCache)} ({nameof(LookupHelper)})"))
            {
                string             serialisedQuery = JsonConvert.SerializeObject(initialisationQuery, new StringEnumConverter());
                HttpRequestMessage request         = new HttpRequestMessage()
                {
                    Content    = new StringContent(serialisedQuery, System.Text.Encoding.UTF8, MIME_TYPE_JSON),
                    Method     = HttpMethod.Put,
                    RequestUri = cacheUrl
                };
                AddHeaders(ref request, token, apiKey, bobId, correlationId);
                request.Headers.Add(HeaderNames.CacheService.ENCRYPTION_KEY_PUBLIC, encryptionKey);
                var responseMessage = await httpClient.SendAsync(request);

                if (!responseMessage.IsSuccessStatusCode)
                {
                    string responseContent = await responseMessage.Content.ReadAsStringAsync();

                    _logger.LogCritical($"Could not perform cache initialisation: {responseMessage.ReasonPhrase}");
                    if (_silentFailure)
                    {
                        return(null);
                    }
                    else
                    {
                        throw new HfException(responseMessage);
                    }
                }
                _logger.LogDebug($"Successfully initialised cache with status code {responseMessage.StatusCode}");
                return(await responseMessage.Content.ReadAsStringAsync());
            }
        }
示例#8
0
        /// <summary>
        /// most generic call of the lookup service.
        /// Posts the content from <paramref name="json"/> to the URL specified in <paramref name="lookupURL"/> using the token
        /// </summary>
        /// <param name="json">serialised lookup request</param>
        /// <param name="lookupURL">URL of the lookup service</param>
        /// <param name="token">token to authenticate</param>
        /// <param name="apiKey">API key for gateway</param>
        /// <param name="backendId">ID of Backend</param>
        /// <returns></returns>
        ///<exception cref="HfException" >if Could not perform lookup and silentFailure is false</exception>

        public async Task <string> LookupJsonWithUserToken(string json, Uri lookupURL, string token, string apiKey, BOBackendId backendId, string correlationId = null)
        {
            using (MiniProfiler.Current.Step(nameof(LookupJsonWithUserToken)))
            {
                HttpRequestMessage request = new HttpRequestMessage()
                {
                    Content    = new StringContent(json, System.Text.UTF8Encoding.UTF8, MIME_TYPE_JSON),
                    Method     = HttpMethod.Post,
                    RequestUri = lookupURL
                };
                AddHeaders(ref request, token, apiKey, backendId, correlationId);
                _logger.LogInformation($"Sending out lookup request with token");
                var responseMessage = await httpClient.SendAsync(request);

                _logger.LogInformation($"Got response from lookup request with token");
                if (!responseMessage.IsSuccessStatusCode)
                {
                    string responseContent = await responseMessage.Content.ReadAsStringAsync();

                    _logger.LogCritical($"Could not perform lookup: {responseMessage.ReasonPhrase} / {responseContent}; The original request was: {json} POSTed to {lookupURL}");
                    if (_silentFailure)
                    {
                        return(null);
                    }
                    else
                    {
                        throw new HfException(responseMessage); // todo @hamid put the full object in the exception
                    }
                }
                _logger.LogDebug($"Successfully retrieved response with status code {responseMessage.StatusCode}");
                return(await responseMessage.Content.ReadAsStringAsync());
            }
        }
示例#9
0
        /// <summary>
        /// Fetching the list of BusinessObjects as a suggested list in base of <paramref name="suggestion"/> string.
        /// </summary>
        /// <param name="suggestion"></param>
        /// <param name="boe4Type"></param>
        /// <param name="lookupURL"></param>
        /// <param name="token"></param>
        /// <param name="apiKey"></param>
        /// <param name="backendId"></param>
        /// <param name="anonymizedResultsOnly"></param>
        /// <returns>Returns a listof suggested BusinessObject</returns>
        /// <exception cref="HfException" >if Could not perform lookup and silentFailure is false</exception>
        public async Task <List <BusinessObject> > Suggest(string suggestion, string boe4Type, Uri lookupURL, string token, string apiKey, BOBackendId backendId, bool anonymizedResultsOnly = false, string correlationId = null)
        {
            var uri = new Uri($"{lookupURL}/suggestion/{boe4Type}/{suggestion}");

            _logger.LogDebug($"Suggestion URL is {uri}");
            HttpRequestMessage request = new HttpRequestMessage()
            {
                Method     = HttpMethod.Get,
                RequestUri = uri
            };

            AddHeaders(ref request, token, apiKey, backendId, correlationId);
            if (request.Headers.Contains(HeaderNames.ANONYMIZED_RESULTS_ONLY))
            {
                _logger.LogDebug($"Removing {HeaderNames.ANONYMIZED_RESULTS_ONLY} header");
                request.Headers.Remove(HeaderNames.ANONYMIZED_RESULTS_ONLY);
            }
            request.Headers.Add(HeaderNames.ANONYMIZED_RESULTS_ONLY, anonymizedResultsOnly.ToString());
            var responseMessage = await httpClient.SendAsync(request);

            string responseContent = await responseMessage.Content.ReadAsStringAsync();

            if (!responseMessage.IsSuccessStatusCode)
            {
                _logger.LogCritical($"Could not perform lookup: {responseMessage.ReasonPhrase} / {responseContent}; The original request was: {suggestion} GETed from {lookupURL}");
                if (_silentFailure)
                {
                    return(null);
                }
                else
                {
                    throw new HfException(responseMessage);
                }
            }
            List <BusinessObject> resultObject = DeserializeObjectAndLog <List <BusinessObject> >(responseContent);

            return(resultObject);
        }
示例#10
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="urls"></param>
        /// <param name="lookupURL"></param>
        /// <param name="token"></param>
        /// <param name="apiKey"></param>
        /// <param name="backendId"></param>
        /// <returns>todo: insert docstring</returns>
        /// <exception cref="HfException" >if Could not perform lookup and silentFailure is false</exception>
        public async Task <GenericLookupResult> RetrieveURLsWithUserToken(IList <Bo4eUri> urls, Uri lookupURL, string token, string apiKey, BOBackendId backendId)
        {
            GenericLookupQuery urlObject = new GenericLookupQuery()
            {
                Uris = urls
            };
            string requestBody = JsonConvert.SerializeObject(urlObject);
            var    request     = new HttpRequestMessage()
            {
                Content    = new StringContent(requestBody, System.Text.UTF8Encoding.UTF8, MIME_TYPE_JSON),
                Method     = HttpMethod.Post,
                RequestUri = lookupURL
            };
            var responseMessage = await httpClient.SendAsync(request);

            string responseContent = await responseMessage.Content.ReadAsStringAsync();

            if (!responseMessage.IsSuccessStatusCode)
            {
                _logger.LogCritical($"Could not perform lookup: {responseMessage.ReasonPhrase} / {responseContent}; The original request was: {requestBody} POSTed to {lookupURL}");
                _logger.LogDebug($"Returning null from lookup helper because of negative response code '{responseMessage.StatusCode}'");
                if (_silentFailure)
                {
                    return(null);
                }
                else
                {
                    throw new HfException(responseMessage);
                }
            }
            GenericLookupResult resultObject = DeserializeObjectAndLog <GenericLookupResult>(responseContent);

            return(resultObject);
        }