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()); }
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); }
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); }
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); }
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)); }
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")); }
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()); }
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 }
/// <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 }
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 }
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(); }