From 344b97e9a34d075e3fbb910ea4578e530dbfca00 Mon Sep 17 00:00:00 2001 From: "Collin M. Barrett" Date: Thu, 2 Nov 2017 12:21:27 -0500 Subject: [PATCH] add in-memory caching to API & Web, add response caching to Web --- src/FilterLists.Api/CacheKeys.cs | 9 +++++ .../Extensions/ConfigureServicesCollection.cs | 1 + src/FilterLists.Api/FilterLists.Api.csproj | 1 + src/FilterLists.Api/Startup.cs | 9 ++--- .../V1/Controllers/ListsController.cs | 14 +++++-- src/FilterLists.Web/CacheKeys.cs | 9 +++++ .../Controllers/HomeController.cs | 16 +++++++- .../Controllers/SampleDataController.cs | 37 ------------------- .../Extensions/ConfigureServicesCollection.cs | 27 ++++++++++++++ src/FilterLists.Web/FilterLists.Web.csproj | 1 + src/FilterLists.Web/Startup.cs | 8 ++-- 11 files changed, 81 insertions(+), 51 deletions(-) create mode 100644 src/FilterLists.Api/CacheKeys.cs create mode 100644 src/FilterLists.Web/CacheKeys.cs delete mode 100644 src/FilterLists.Web/Controllers/SampleDataController.cs create mode 100644 src/FilterLists.Web/DependencyInjection/Extensions/ConfigureServicesCollection.cs diff --git a/src/FilterLists.Api/CacheKeys.cs b/src/FilterLists.Api/CacheKeys.cs new file mode 100644 index 000000000..4e0666dc4 --- /dev/null +++ b/src/FilterLists.Api/CacheKeys.cs @@ -0,0 +1,9 @@ +// https://github.com/aspnet/Docs/blob/master/aspnetcore/performance/caching/memory/sample/WebCache/CacheKeys.cs + +namespace FilterLists.Api +{ + public static class CacheKeys + { + public static readonly string Entry = "_Entry"; + } +} \ No newline at end of file diff --git a/src/FilterLists.Api/DependencyInjection/Extensions/ConfigureServicesCollection.cs b/src/FilterLists.Api/DependencyInjection/Extensions/ConfigureServicesCollection.cs index e0e86db85..66f6f9b15 100644 --- a/src/FilterLists.Api/DependencyInjection/Extensions/ConfigureServicesCollection.cs +++ b/src/FilterLists.Api/DependencyInjection/Extensions/ConfigureServicesCollection.cs @@ -13,6 +13,7 @@ public static void AddFilterListsApi(this IServiceCollection services) services.AddMvcCustom(); services.AddApiVersioning(); services.AddResponseCaching(); + services.AddMemoryCache(); services.AddSwaggerGenCustom(); } diff --git a/src/FilterLists.Api/FilterLists.Api.csproj b/src/FilterLists.Api/FilterLists.Api.csproj index 4a60b0fe2..cc06cb63e 100644 --- a/src/FilterLists.Api/FilterLists.Api.csproj +++ b/src/FilterLists.Api/FilterLists.Api.csproj @@ -26,6 +26,7 @@ + diff --git a/src/FilterLists.Api/Startup.cs b/src/FilterLists.Api/Startup.cs index 0133674f2..3e1a8eaed 100644 --- a/src/FilterLists.Api/Startup.cs +++ b/src/FilterLists.Api/Startup.cs @@ -28,19 +28,18 @@ public void Configure(IApplicationBuilder app) { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto }); - app.UseResponseCaching(); - app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/v1/swagger.json", "FilterLists API V1"); c.RoutePrefix = "docs"; }); - app.UseStaticFiles(); - - app.UseMvc(routes => { routes.MapRoute("default", "v{version:apiVersion}/{controller=Default}/{action=Get}/{id?}"); }); + app.UseMvc(routes => + { + routes.MapRoute("default", "v{version:apiVersion}/{controller=Default}/{action=Get}/{id?}"); + }); } } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/ListsController.cs b/src/FilterLists.Api/V1/Controllers/ListsController.cs index a0759c33b..cd306da83 100644 --- a/src/FilterLists.Api/V1/Controllers/ListsController.cs +++ b/src/FilterLists.Api/V1/Controllers/ListsController.cs @@ -1,5 +1,7 @@ -using FilterLists.Services.Contracts; +using System; +using FilterLists.Services.Contracts; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; namespace FilterLists.Api.V1.Controllers { @@ -9,16 +11,22 @@ namespace FilterLists.Api.V1.Controllers public class ListsController : Controller { private readonly IFilterListService filterListService; + private readonly IMemoryCache memoryCache; - public ListsController(IFilterListService filterListService) + public ListsController(IMemoryCache memoryCache, IFilterListService filterListService) { + this.memoryCache = memoryCache; this.filterListService = filterListService; } [HttpGet] public IActionResult Get() { - return Json(filterListService.GetAllSummaries()); + return memoryCache.GetOrCreate(CacheKeys.Entry, entry => + { + entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(86400); + return Json(filterListService.GetAllSummaries()); + }); } } } \ No newline at end of file diff --git a/src/FilterLists.Web/CacheKeys.cs b/src/FilterLists.Web/CacheKeys.cs new file mode 100644 index 000000000..4f81731cf --- /dev/null +++ b/src/FilterLists.Web/CacheKeys.cs @@ -0,0 +1,9 @@ +// https://github.com/aspnet/Docs/blob/master/aspnetcore/performance/caching/memory/sample/WebCache/CacheKeys.cs + +namespace FilterLists.Web +{ + public static class CacheKeys + { + public static readonly string Entry = "_Entry"; + } +} \ No newline at end of file diff --git a/src/FilterLists.Web/Controllers/HomeController.cs b/src/FilterLists.Web/Controllers/HomeController.cs index 24b36aff6..4e19389f5 100644 --- a/src/FilterLists.Web/Controllers/HomeController.cs +++ b/src/FilterLists.Web/Controllers/HomeController.cs @@ -1,13 +1,27 @@ +using System; using System.Diagnostics; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Caching.Memory; namespace FilterLists.Web.Controllers { + [ResponseCache(CacheProfileName = "Long-Lived")] public class HomeController : Controller { + private readonly IMemoryCache memoryCache; + + public HomeController(IMemoryCache memoryCache) + { + this.memoryCache = memoryCache; + } + public IActionResult Index() { - return View(); + return memoryCache.GetOrCreate(CacheKeys.Entry, entry => + { + entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(86400); + return View(); + }); } public IActionResult Error() diff --git a/src/FilterLists.Web/Controllers/SampleDataController.cs b/src/FilterLists.Web/Controllers/SampleDataController.cs deleted file mode 100644 index 24b6de753..000000000 --- a/src/FilterLists.Web/Controllers/SampleDataController.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.AspNetCore.Mvc; - -namespace FilterLists.Web.Controllers -{ - [Route("api/[controller]")] - public class SampleDataController : Controller - { - private static readonly string[] Summaries = - { - "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" - }; - - [HttpGet("[action]")] - public IEnumerable WeatherForecasts() - { - var rng = new Random(); - return Enumerable.Range(1, 5).Select(index => new WeatherForecast - { - DateFormatted = DateTime.Now.AddDays(index).ToString("d"), - TemperatureC = rng.Next(-20, 55), - Summary = Summaries[rng.Next(Summaries.Length)] - }); - } - - public class WeatherForecast - { - public string DateFormatted { get; set; } - public int TemperatureC { get; set; } - public string Summary { get; set; } - - public int TemperatureF => 32 + (int) (TemperatureC / 0.5556); - } - } -} \ No newline at end of file diff --git a/src/FilterLists.Web/DependencyInjection/Extensions/ConfigureServicesCollection.cs b/src/FilterLists.Web/DependencyInjection/Extensions/ConfigureServicesCollection.cs new file mode 100644 index 000000000..0d59f3e5a --- /dev/null +++ b/src/FilterLists.Web/DependencyInjection/Extensions/ConfigureServicesCollection.cs @@ -0,0 +1,27 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; + +namespace FilterLists.Web.DependencyInjection.Extensions +{ + public static class ConfigureServicesCollection + { + public static void AddFilterListsWeb(this IServiceCollection services) + { + services.AddMvcCustom(); + services.AddResponseCaching(); + services.AddMemoryCache(); + } + + private static void AddMvcCustom(this IServiceCollection services) + { + services.AddMvc(options => + { + options.CacheProfiles.Add("Long-Lived", + new CacheProfile + { + Duration = 86400 + }); + }); + } + } +} \ No newline at end of file diff --git a/src/FilterLists.Web/FilterLists.Web.csproj b/src/FilterLists.Web/FilterLists.Web.csproj index 869b1cb76..a8e17ed11 100644 --- a/src/FilterLists.Web/FilterLists.Web.csproj +++ b/src/FilterLists.Web/FilterLists.Web.csproj @@ -11,6 +11,7 @@ + diff --git a/src/FilterLists.Web/Startup.cs b/src/FilterLists.Web/Startup.cs index 91f8bb47a..43c5a6300 100644 --- a/src/FilterLists.Web/Startup.cs +++ b/src/FilterLists.Web/Startup.cs @@ -1,3 +1,4 @@ +using FilterLists.Web.DependencyInjection.Extensions; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.SpaServices.Webpack; @@ -17,7 +18,7 @@ public Startup(IConfiguration configuration) public void ConfigureServices(IServiceCollection services) { - services.AddMvc(); + services.AddFilterListsWeb(); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) @@ -32,12 +33,9 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) }); } else - { app.UseExceptionHandler("/Home/Error"); - } - + app.UseResponseCaching(); app.UseStaticFiles(); - app.UseMvc(routes => { routes.MapRoute(