Exemplo n.º 1
0
        public void AddTest()
        {
            var cacheKey = new CacheKey("/api/Cars", new[] { "1234", "abcdef" });
            var store    = new SqlServerEntityTagStore();
            var value    = new TimedEntityTagHeaderValue("\"abcdef1234\"")
            {
                LastModified = DateTime.Now
            };


            // first remove them
            store.RemoveAllByRoutePattern(cacheKey.RoutePattern);

            // add
            store.AddOrUpdate(cacheKey, value);

            // get
            TimedEntityTagHeaderValue dbValue;

            store.TryGetValue(cacheKey, out dbValue);


            Assert.AreEqual(value.Tag, dbValue.Tag);
            Assert.AreEqual(value.LastModified.ToString(), dbValue.LastModified.ToString());
        }
Exemplo n.º 2
0
		public void UpdateTest()
		{
			var cacheKey = new CacheKey("/api/Cars", new[] { "1234", "abcdef" });
			var store = new SqlServerEntityTagStore();
			var value = new TimedEntityTagHeaderValue("\"abcdef1234\"") { LastModified = DateTime.Now };


			// first remove them
			store.RemoveAllByRoutePattern(cacheKey.RoutePattern);

			// add
			store.AddOrUpdate(cacheKey, value);

			// get
			TimedEntityTagHeaderValue dbValue;
			store.TryGetValue(cacheKey, out dbValue);

			value.LastModified = DateTime.Now.AddDays(-1);

			// update
			store.AddOrUpdate(cacheKey, value);

			// get
			TimedEntityTagHeaderValue dbValue2;
			store.TryGetValue(cacheKey, out dbValue2);

			Assert.AreEqual(dbValue.Tag, dbValue2.Tag);
			Assert.Greater(dbValue.LastModified, dbValue2.LastModified);
			Console.WriteLine(dbValue2.Tag);
			Console.WriteLine(dbValue2.LastModified);
		}
Exemplo n.º 3
0
        private static void ConfigureCachingETagSupport(HttpConfiguration config)
        {
            var connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"]?.ConnectionString;
            var sqlTagStore      = new SqlServerEntityTagStore(connectionString);
            var cachingHandler   = new CachingHandler(config, sqlTagStore);

            config.MessageHandlers.Add(cachingHandler);
        }
Exemplo n.º 4
0
        private static void SetupDbCaching(HttpConfiguration config)
        {
            var connectionString = ConfigurationManager.ConnectionStrings["cache"].ConnectionString;
            var cacheStore       = new SqlServerEntityTagStore(connectionString);
            var cacheHandler     = new CachingHandler(config, cacheStore)
            {
                AddLastModifiedHeader = false
            };

            config.MessageHandlers.Add(cacheHandler);
        }
Exemplo n.º 5
0
        public void RemoveByIdTest()
        {
            var cacheKey = new CacheKey("/api/Cars", new[] { "1234", "abcdef" });
            var store = new SqlServerEntityTagStore();
            var value = new TimedEntityTagHeaderValue("\"abcdef1234\"") { LastModified = DateTime.Now };

            // first remove them
            store.RemoveAllByRoutePattern(cacheKey.RoutePattern);

            // add
            store.AddOrUpdate(cacheKey, value);

            // delete
            Assert.True(store.TryRemove(cacheKey));
            Assert.True(!store.TryRemove(cacheKey));
        }
Exemplo n.º 6
0
        public void RemoveByIdResourceUri()
        {
            var cacheKey = new CacheKey("/api/Cars/123", new[] { "1234", "abcdef" }, "111");
            var cacheKey2 = new CacheKey("/api/Cars/123", new[] { "1234", "abcdefgh", "222" });
            var store = new SqlServerEntityTagStore();
            var value = new TimedEntityTagHeaderValue("\"abcdef1234\"") { LastModified = DateTime.Now };

            // first remove them
            store.RemoveAllByRoutePattern(cacheKey.RoutePattern);

            // add
            store.AddOrUpdate(cacheKey, value);
            store.AddOrUpdate(cacheKey2, value);

            // delete
            Assert.AreEqual(2, store.RemoveResource("/api/Cars/123"));
        }
Exemplo n.º 7
0
        public void AddTest()
        {
            var cacheKey = new CacheKey("/api/Cars", new[] {"1234", "abcdef"});
            var store = new SqlServerEntityTagStore();
            var value = new TimedEntityTagHeaderValue("\"abcdef1234\"") {LastModified = DateTime.Now};

            // first remove them
            store.RemoveAllByRoutePattern(cacheKey.RoutePattern);

            // add
            store.AddOrUpdate(cacheKey, value);

            // get
            TimedEntityTagHeaderValue dbValue;
            store.TryGetValue(cacheKey, out dbValue);

            Assert.AreEqual(value.Tag, dbValue.Tag);
            Assert.AreEqual(value.LastModified.ToString(), dbValue.LastModified.ToString());
        }
Exemplo n.º 8
0
        public void RemoveByIdTest()
        {
            var cacheKey = new CacheKey("/api/Cars", new[] { "1234", "abcdef" });
            var store    = new SqlServerEntityTagStore();
            var value    = new TimedEntityTagHeaderValue("\"abcdef1234\"")
            {
                LastModified = DateTime.Now
            };


            // first remove them
            store.RemoveAllByRoutePattern(cacheKey.RoutePattern);

            // add
            store.AddOrUpdate(cacheKey, value);

            // delete
            Assert.True(store.TryRemove(cacheKey));
            Assert.True(!store.TryRemove(cacheKey));
        }
Exemplo n.º 9
0
        public void RemoveByIdResourceUri()
        {
            var cacheKey  = new CacheKey("/api/Cars/123", new[] { "1234", "abcdef" }, "111");
            var cacheKey2 = new CacheKey("/api/Cars/123", new[] { "1234", "abcdefgh", "222" });
            var store     = new SqlServerEntityTagStore();
            var value     = new TimedEntityTagHeaderValue("\"abcdef1234\"")
            {
                LastModified = DateTime.Now
            };


            // first remove them
            store.RemoveAllByRoutePattern(cacheKey.RoutePattern);

            // add
            store.AddOrUpdate(cacheKey, value);
            store.AddOrUpdate(cacheKey2, value);

            // delete
            Assert.AreEqual(2, store.RemoveResource("/api/Cars/123"));
        }
Exemplo n.º 10
0
        public void UpdateTest()
        {
            var cacheKey = new CacheKey("/api/Cars", new[] { "1234", "abcdef" });
            var store    = new SqlServerEntityTagStore();
            var value    = new TimedEntityTagHeaderValue("\"abcdef1234\"")
            {
                LastModified = DateTime.Now
            };


            // first remove them
            store.RemoveAllByRoutePattern(cacheKey.RoutePattern);

            // add
            store.AddOrUpdate(cacheKey, value);

            // get
            TimedEntityTagHeaderValue dbValue;

            store.TryGetValue(cacheKey, out dbValue);

            value.LastModified = DateTime.Now.AddDays(-1);

            // update
            store.AddOrUpdate(cacheKey, value);

            // get
            TimedEntityTagHeaderValue dbValue2;

            store.TryGetValue(cacheKey, out dbValue2);

            Assert.AreEqual(dbValue.Tag, dbValue2.Tag);
            Assert.Greater(dbValue.LastModified, dbValue2.LastModified);
            Console.WriteLine(dbValue2.Tag);
            Console.WriteLine(dbValue2.LastModified);
        }
Exemplo n.º 11
0
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: FOODS_ROUTE,
                routeTemplate: "api/nutrition/foods/{foodid}",
                defaults: new { controller = "foods", foodid = RouteParameter.Optional }
                );

            config.Routes.MapHttpRoute(
                name: MEASURES_ROUTE,
                routeTemplate: "api/nutrition/foods/{foodid}/measures/{measureid}",
                defaults: new { controller = "measures", measureid = RouteParameter.Optional }
                );

            config.Routes.MapHttpRoute(
                name: DIARIES_ROUTE,
                routeTemplate: "api/user/diaries/{diaryid}",
                defaults: new { controller = "diaries", diaryid = RouteParameter.Optional }
                );

            config.Routes.MapHttpRoute(
                name: DIARY_ENTRIES_ROUTE,
                routeTemplate: "api/user/diaries/{diaryid}/entries/{entryid}",
                defaults: new { controller = "diaryentries", entryid = RouteParameter.Optional }
                );

            config.Routes.MapHttpRoute(
                name: DIARY_SUMMARY_ROUTE,
                routeTemplate: "api/user/diaries/{diaryid}/summary",
                defaults: new { controller = "diarysummary" }
                );

            config.Routes.MapHttpRoute(
                name: TOKEN_ROUTE,
                routeTemplate: "api/token",
                defaults: new { controller = "token" }
                );

            // Web API configuration and services
            config.Formatters.Remove(config.Formatters.XmlFormatter);
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new LinkModelConverter());
            CreateCustomMediaTypes(config.Formatters.JsonFormatter);

            // Enable DI for filters / attributes
            config.Services.Add(typeof(IFilterProvider), new UnityFilterProvider(UnityConfig.Container));

            // Replace default controller selector
            config.Services.Replace(typeof(IHttpControllerSelector), new NutritionDiaryControllerSelector(config));

            // CORS support
            var policyProvider = new EnableCorsAttribute("*", "*", "*");

            config.EnableCors(policyProvider);

#if !DEBUG
            // Configure Caching/ETag support
            var connectionString = ConfigurationManager.ConnectionStrings[DEFAULT_CONNECTION_KEY].ConnectionString;
            var etagStore        = new SqlServerEntityTagStore(connectionString);
            var cacheHandler     = new CachingHandler(config, etagStore);
            config.MessageHandlers.Add(cacheHandler);
#endif

#if !DEBUG
            // Force HTTPS on entire Web API
            config.Filters.Add(new RequireHttpsAttribute());
#endif
        }
Exemplo n.º 12
0
        /// <summary>Registers the specified configuration.</summary>
        /// <param name="config">The configuration.</param>
        /// <param name="unityContainer">The unity container.</param>
        /// <param name="unitOfWork">The unit of work.</param>
        public static void Register(HttpConfiguration config, IUnityContainer unityContainer, IUnitOfWork unitOfWork)
        {
            var applicationSettingRepository = unitOfWork.GetTypedRepository <IApplicationSettingRepository>();

            etagCacheServerDuration = applicationSettingRepository.GetOrCreateByName <int>("EtagCacheServerDuration");
            etagCacheClientDuration = applicationSettingRepository.GetOrCreateByName <int>("EtagCacheClientDuration");

#if !DEBUG
            // Configure Web API to use only bearer token authentication.
            // Only suppress if not in debug mode, this allows browsing the WebAPI if in debug mode.
            config.SuppressDefaultHostAuthentication();
#endif

            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
            config.Filters.Add(new ModelStateValidationFilter());
            config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

            config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new SelectSupportConverter());

            var browserFormatter = new BrowserJsonFormatter
            {
                SerializerSettings =
                {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                }
            };

            browserFormatter.SerializerSettings.Converters.Add(new SelectSupportConverter());

            config.Formatters.Add(browserFormatter);

            config.DependencyResolver = new UnityDependencyResolver(unityContainer);

            // Changing this setting requires a website restart
            if (applicationSettingRepository.GetOrCreateByName <bool>("Caching_EnableEtags"))
            {
                var etagStore = new SqlServerEntityTagStore(ConfigurationManager.ConnectionStrings["InSite.Commerce"].ConnectionString);

                // The vary by in the constructor needs to be something that is unique per user so it generates ETags uniquely per user
                // Cookie contains a cookie we generate InsiteCacheId that is a guid per user.
                var cacheHandler = new CachingHandler(config, etagStore, "Cookie")
                {
                    // This must be false so IE client side caching works, anything that needs to vary needs to be done by uri or querystring
                    AddVaryHeader              = false,
                    AddLastModifiedHeader      = true,
                    RoutePatternProvider       = new CacheRoutePatternProvider(),
                    CacheControlHeaderProvider = CacheControlHeaderProvider,
                    CacheRefreshPolicyProvider = CacheRefreshPolicyProvider
                };
                config.MessageHandlers.Add(cacheHandler);
            }

            config.MessageHandlers.Add(new LocalizationHandler());
            config.MapHttpAttributeRoutes(new InheritanceDirectRouteProvider());

            // There can be multiple exception loggers. (By default, no exception loggers are registered.)
            config.Services.Add(typeof(IExceptionLogger), unityContainer.Resolve <IExceptionLogger>());

            // There must be exactly one exception handler. (There is a default one that may be replaced.)
            config.Services.Replace(typeof(IExceptionHandler), unityContainer.Resolve <IExceptionHandler>());
        }
        public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();

            //config.Routes.MapHttpRoute(
            //    name: "Food",
            //    routeTemplate: "api/nutrition/foods/{foodid}",
            //    defaults: new { controller = "foods", foodid = RouteParameter.Optional }
            //);

            config.Routes.MapHttpRoute(
                name: "Measures",
                routeTemplate: "api/nutrition/foods/{foodid}/measures/{id}",
                defaults: new { controller = "measures", id = RouteParameter.Optional }
                );

            //config.Routes.MapHttpRoute(
            //    name: "Measures2",
            //    routeTemplate: "api/nutrition/foods/{foodid}/measures/{id}",
            //    defaults: new { controller = "measuresv2", id = RouteParameter.Optional }
            //);

            config.Routes.MapHttpRoute(
                name: "Diaries",
                routeTemplate: "api/user/diaries/{diaryid}",
                defaults: new { controller = "diaries", diaryid = RouteParameter.Optional }
                );

            config.Routes.MapHttpRoute(
                name: "DiaryEntries",
                routeTemplate: "api/user/diaries/{diaryid}/entries/{id}",
                defaults: new { controller = "diaryentries", id = RouteParameter.Optional }
                );

            config.Routes.MapHttpRoute(
                name: "DiarySummary",
                routeTemplate: "api/user/diaries/{diaryid}/summary",
                defaults: new { controller = "diarysummary" }
                );

            config.Routes.MapHttpRoute(
                name: "Tokens",
                routeTemplate: "api/token",
                defaults: new { controller = "token" }
                );

            // Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type.
            // To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries.
            // For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712.
            //config.EnableQuerySupport();

            var jsonFormatter = config.Formatters.OfType <JsonMediaTypeFormatter>().FirstOrDefault();

            jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            jsonFormatter.SerializerSettings.Converters.Add(new LinkModelConverter());
            CreateMediaTypes(jsonFormatter);

            // Add support JSONP
            var formatter = new JsonpMediaTypeFormatter(jsonFormatter, "cb");

            config.Formatters.Insert(0, formatter);

            // Replace the Controller Configuration
            config.Services.Replace(typeof(IHttpControllerSelector),
                                    new CountingKsControllerSelector(config));

            // Configure Caching/ETag Support
            var connString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
            // REMINDER: Make sure you've run the SQL Scripts in the
            //           Package Folder!
            var etagStore    = new SqlServerEntityTagStore(connString);
            var cacheHandler = new CachingHandler(etagStore);

            config.MessageHandlers.Add(cacheHandler);

            // Add support CORS
            var attr = new EnableCorsAttribute("*", "*", "GET");

            config.EnableCors(attr);

#if !DEBUG
            // Force HTTPS on entire API
            config.Filters.Add(new RequireHttpsAttribute());
#endif
        }
Exemplo n.º 14
0
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "Food",
                routeTemplate: "api/nutrition/foods/{foodid}",
                defaults: new { controller = "foods", foodid = RouteParameter.Optional }
                //constraints: new { id = "/d+"}
                );

            config.Routes.MapHttpRoute(
                name: "Measures",
                routeTemplate: "api/nutrition/foods/{foodid}/measures/{id}",
                defaults: new { controller = "measures", id = RouteParameter.Optional }
                );

            config.Routes.MapHttpRoute(
                name: "Diaries",
                routeTemplate: "api/user/diaries/{diaryid}",
                defaults: new { controller = "diaries", diaryid = RouteParameter.Optional }
                );

            config.Routes.MapHttpRoute(
                name: "DiaryEntries",
                routeTemplate: "api/user/diaries/{diaryid}/entries/{id}",
                defaults: new { controller = "diaryentries", id = RouteParameter.Optional }
                );

            config.Routes.MapHttpRoute(
                name: "DiarySummary",
                routeTemplate: "api/user/diaries/{diaryid}/summary",
                defaults: new { controller = "diarysummary" }
                );

            config.Routes.MapHttpRoute(
                name: "Token",
                routeTemplate: "api/token",
                defaults: new { controller = "token" }
                );

            // Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type.
            // To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries.
            // For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712.
            //config.EnableQuerySupport();

            var jsonFormatter = config.Formatters.OfType <JsonMediaTypeFormatter>().FirstOrDefault();

            jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            jsonFormatter.SerializerSettings.Converters.Add(new LinkModelConverter());
            CreteMediaTypes(jsonFormatter);
            //Add Supportfor JsonP.
            var formatter = new JsonpMediaTypeFormatter(jsonFormatter, "cb");

            config.Formatters.Insert(0, formatter);

            //Replace the controllerselector with our customController selector
            config.Services.Replace(typeof(IHttpControllerSelector), new CountingKsControllerSelector(config));

            //Configure caching/Etag Support
            var connectionString     = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
            var sqlServerEntityStore = new SqlServerEntityTagStore(connectionString);
            var cacheHandler         = new CachingHandler(sqlServerEntityStore);

            config.MessageHandlers.Add(cacheHandler);

#if !DEBUG
            //Forces the entire API to use SSL encryption.
            config.Filters.Add(new RequireHttpsAttribute());
#endif
        }
Exemplo n.º 15
0
        public static void Register(HttpConfiguration config)
        {
            config.MapHttpAttributeRoutes();

            // The food controller is using attribute routing
            //config.Routes.MapHttpRoute(
            //    name: "Food",
            //    routeTemplate: "api/nutrition/food/{id}",
            //    defaults: new
            //    {
            //      controller = "Food",
            //      id = RouteParameter.Optional
            //    }
            //);

            config.Routes.MapHttpRoute(
                name: "Measure",
                routeTemplate: "api/nutrition/food/{foodid}/measure/{id}",
                defaults: new
            {
                controller = "Measure",
                id         = RouteParameter.Optional
            }
                );

            //config.Routes.MapHttpRoute(
            //    name: "MeasureV2",
            //    routeTemplate: "api/nutrition/food/{foodid}/measure/{id}",
            //    defaults: new
            //    {
            //      controller = "MeasureV2",
            //      id = RouteParameter.Optional
            //    }
            //);

            config.Routes.MapHttpRoute(
                name: "Diary",
                routeTemplate: "api/user/diary/{date}",
                defaults: new
            {
                controller = "Diary",
                date       = RouteParameter.Optional
            }
                );

            config.Routes.MapHttpRoute(
                name: "DiaryEntry",
                routeTemplate: "api/user/diary/{date}/entry/{id}",
                defaults: new
            {
                controller = "DiaryEntry",
                id         = RouteParameter.Optional
            }
                );

            config.Routes.MapHttpRoute(
                name: "DiarySummary",
                routeTemplate: "api/user/diary/{date}/summary",
                defaults: new
            {
                controller = "DiarySummary"
            }
                );

            config.Routes.MapHttpRoute(
                name: "Token",
                routeTemplate: "api/token",
                defaults: new
            {
                controller = "Token"
            }
                );

            //config.Routes.MapHttpRoute(
            //    name: "DefaultApi",
            //    routeTemplate: "api/{controller}/{id}",
            //    defaults: new { id = RouteParameter.Optional }
            //);

            JsonMediaTypeFormatter jsonFormatter = config
                                                   .Formatters
                                                   .OfType <JsonMediaTypeFormatter>()
                                                   .FirstOrDefault();

            // Makes it so that the property names of the returned json data is Camel case and not Pascal case
            jsonFormatter
            .SerializerSettings
            .ContractResolver = new CamelCasePropertyNamesContractResolver();

            jsonFormatter.SerializerSettings.Converters.Add(new LinkModelConverter());

            CreateMediaTypes(jsonFormatter);

            // Support for JSONP
            JsonpMediaTypeFormatter formatter = new JsonpMediaTypeFormatter(jsonFormatter, "cb");

            config.Formatters.Insert(0, formatter);

            // Makes it so that only Https calls are accepted
            //config.Filters.Add(new RequireHttpsAttribute());

            // Replace the controller configuration
            config.Services.Replace(
                typeof(IHttpControllerSelector),
                new CountingKsControllerSelector(config));

            // Configure Cashing/Etag Support
            string connectionString              = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
            SqlServerEntityTagStore etagStore    = new SqlServerEntityTagStore(connectionString);
            CachingHandler          cacheHandler = new CachingHandler(etagStore)
            {
                AddLastModifiedHeader = false
            };

            config.MessageHandlers.Add(cacheHandler);

            // Add support CORS
            EnableCorsAttribute attr = new EnableCorsAttribute("*", "*", "GET");

            config.EnableCors(attr);

            // Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type.
            // To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries.
            // For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712.
            //config.EnableQuerySupport();
        }