public async Task <IHttpActionResult> Get(string street)
        {
            if (string.IsNullOrEmpty(street))
            {
                return(BadRequest());
            }

            int minCharacterCount = Convert.ToInt32(ConfigurationManager.AppSettings["MinimumCharacterCount"]);

            if (street.Count() <= minCharacterCount)
            {
                return(Ok(new AddressCandidatesReturnResult()));
            }

            string encodedAddress = System.Web.HttpUtility.UrlEncode(street);

            var service = new AddressCandidatesServiceClient();

            service.AddressCandidatesApiUrl = ConfigurationManager.AppSettings["AddressCandidatesApiUrl"];

            HttpStatusCode[] httpStatusCodesWorthRetrying =
            {
                HttpStatusCode.RequestTimeout,      // 408
                HttpStatusCode.InternalServerError, // 500
                HttpStatusCode.BadGateway,          // 502
                HttpStatusCode.ServiceUnavailable,  // 503
                HttpStatusCode.GatewayTimeout       // 504
            };

            var retryPolicy = Policy
                              .HandleResult <AddressCandidatesReturnResult>(r => httpStatusCodesWorthRetrying.Contains(r.HttpResponseStatusCode))
                              .OrResult(r => r == null)
                              .RetryAsync(3);

            var results = await retryPolicy.ExecuteAsync(async() => await GetResultFromFindAddressCandidates(encodedAddress, service));

            if (results == null)
            {
                var response = new HttpResponseMessage(HttpStatusCode.NotFound)
                {
                    Content      = new StringContent(string.Format("No record found for {0}", street)),
                    ReasonPhrase = "Address Not Found"
                };
                throw new HttpResponseException(response);
            }

            if (results.HttpResponseStatusCode != HttpStatusCode.OK)
            {
                throw new HttpResponseException(results.HttpResponseStatusCode);
            }

            return(Ok(results));
        }
 private async Task <AddressCandidatesReturnResult> GetResultFromFindAddressCandidates(string encodedAddress, AddressCandidatesServiceClient service)
 {
     return(await service.GetAsync(encodedAddress));
 }