public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

            var cacheService  = new MemoryCacheService(int.Parse(ConfigurationManager.AppSettings["CacheDurationInSeconds"]));
            var configuration = new CachedConfiguration(new ConfigurationManagerConfiguration(), cacheService);

            var webProxyUserRepository = new CachedWebProxyUserRepository(new SqlServerWebProxyUserRepository(configuration), cacheService);

            //var proxyLogging = new FileProxyLogging(configuration);
            var proxyLogging = new AzureBlobStorageLogging(configuration);
            //var proxyLogging = new NullProxyLogging();

            //var proxyRouting = new LogicRouting();
            var proxyRouting = new NasAvWebServicesRouting(configuration, webProxyUserRepository);


            config.Routes.MapHttpRoute(name: "Proxy", routeTemplate: "{*path}", handler:
                                       HttpClientFactory.CreatePipeline(
                                           innerHandler: new HttpClientHandler(), // will never get here if proxy is doing its job
                                           handlers: new DelegatingHandler[] { new ProxyHandler(proxyRouting, proxyLogging, configuration) }),
                                       defaults: new { path = RouteParameter.Optional },
                                       constraints: null
                                       );
        }
        public void RouteToCompatabilityWebServiceUri_WebProxyUser(string uriString, bool compatabilityWebServiceShouldBePrimary)
        {
            //Arrange
            _configuration.Setup(c => c.AutomaticRouteToCompatabilityWebServiceRegex).Returns(new Regex(""));
            _proxyRouting = new NasAvWebServicesRouting(_configuration.Object, _webProxyUserRepository.Object);
            var uri = new Uri(uriString);

            //Act
            var routing = _proxyRouting.GetRouting(uri, HttpMethod.Get, null, GetRequestContent(RoutedExternalSystemId), new RouteIdentifier());

            //Assert
            routing.Routes.Count.Should().Be(2);
            routing.Routes[0].Uri.AbsoluteUri.Should().StartWith(NasAvWebServiceRootUriString);
            routing.Routes[0].IsPrimary.Should().Be(!compatabilityWebServiceShouldBePrimary);
            routing.Routes[1].Uri.AbsoluteUri.Should().StartWith(CompatabilityWebServiceRootUriString);
            routing.Routes[1].IsPrimary.Should().Be(compatabilityWebServiceShouldBePrimary);
        }
        public void SetUp()
        {
            _configuration = new Mock <IConfiguration>();
            _configuration.Setup(c => c.NasAvWebServiceRootUri).Returns(new Uri(NasAvWebServiceRootUriString));
            _configuration.Setup(c => c.CompatabilityWebServiceRootUri).Returns(new Uri(CompatabilityWebServiceRootUriString));
            _configuration.Setup(c => c.AutomaticRouteToCompatabilityWebServiceRegex).Returns(new Regex(@"^.+?\/(ReferenceData51\.svc|VacancyDetails51\.svc|VacancySummary51\.svc)$", RegexOptions.IgnoreCase));

            _webProxyUserRepository = new Mock <IWebProxyUserRepository>();
            _webProxyUserRepository.Setup(r => r.Get(RoutedExternalSystemId))
            .Returns(new WebProxyConsumer
            {
                WebProxyConsumerId = 1,
                ExternalSystemId   = RoutedExternalSystemId,
                RouteToCompatabilityWebServiceRegex =
                    @"^.+?\/(ApplicationTracking51\.svc|VacancyManagement51\.svc)$"
            });

            _proxyRouting = new NasAvWebServicesRouting(_configuration.Object, _webProxyUserRepository.Object);
        }