Response Caching
Response caching reduces the number of requests a client or proxy makes to a web server. See the Microsoft documentation for details of Response caching in ASP.NET Core and how to implement the Response Caching Middleware.
Example class to allow the modification of the
Cache-Control
header for static assets by file extension, but excluding Umbraco BackOffice assets.using System.IO;
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Options;
using Microsoft.AspNetCore.Http.Headers;
using Microsoft.Net.Http.Headers;
using Umbraco.Cms.Core.Configuration.Models;
using IHostingEnvironment = Umbraco.Cms.Core.Hosting.IHostingEnvironment;
namespace Umbraco.Docs.Samples.Web.Tutorials
{
public class ConfigureStaticFileOptions : IConfigureOptions<StaticFileOptions>
{
// These are the extensions of the file types we want to cache (add and remove as you see fit)
private static readonly HashSet<string> _cachedFileExtensions = new(StringComparer.OrdinalIgnoreCase)
{
".ico",
".css",
".js",
".svg",
".woff2",
".jpg"
};
private readonly string _backOfficePath;
public ConfigureStaticFileOptions(IOptions<GlobalSettings> globalSettings, IHostingEnvironment hostingEnvironment)
=> _backOfficePath = globalSettings.Value.GetBackOfficePath(hostingEnvironment);
public void Configure(StaticFileOptions options)
=> options.OnPrepareResponse = ctx =>
{
// Exclude Umbraco backoffice assets
if (ctx.Context.Request.Path.StartsWithSegments(_backOfficePath))
{
return;
}
// Set headers for specific file extensions
var fileExtension = Path.GetExtension(ctx.File.Name);
if (_cachedFileExtensions.Contains(fileExtension))
{
ResponseHeaders headers = ctx.Context.Response.GetTypedHeaders();
// Update or set Cache-Control header
CacheControlHeaderValue cacheControl = headers.CacheControl ?? new CacheControlHeaderValue();
cacheControl.Public = true;
cacheControl.MaxAge = TimeSpan.FromDays(365);
headers.CacheControl = cacheControl;
}
};
}
}
Register the service in
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IConfigureOptions<StaticFileOptions>, ConfigureStaticFileOptions>();
For setting
Cache-Control
max-age header for images processed by the ImageSharp middleware, you can set the Umbraco:CMS:Imaging:Cache:BrowserMaxAge
setting.For example using a custom Default Controller you can add the ResponseCache attribute to the
Index
methodpublic class DefaultController : RenderController
{
public DefaultController(ILogger<RenderController> logger, ICompositeViewEngine compositeViewEngine, IUmbracoContextAccessor umbracoContextAccessor) : base(logger, compositeViewEngine, umbracoContextAccessor)
{
}
[ResponseCache(NoStore = true, Location = ResponseCacheLocation.None)]
public override IActionResult Index()
{
return CurrentTemplate(new ContentModel(CurrentPage));
}
}
Last modified 4mo ago