ETag Middleware for Asp.Net Core -.NetStandard 2.0 Is supports Caching with Http Request Header 'If-None-Match' with Http Respons Header 'ETag' and set the HttpStatus tu 304. Http Request Header 'Cache-Controle' with 'no-cache' is integrated and would set the HttpStatus to 200.
I was inspired by Mads Kristensen Blog. The Example from him, can you find here as code. Thanks for your artikle!
.NETStandard2.0
Download from Nuget.org
"dependencies": {
"BLun.ETagMiddleware": "<version>"
}
- BLun.ETagMiddleware for Asp.Net Core Http
- Microsoft.AspNetCore.Http.IMiddleware
- BLun.ETagAttribute for Asp.Net Core Mvc
- Microsoft.AspNetCore.Mvc.Filters.IAsyncActionFilter
- Supports
- Microsoft.Extensions.Logging
- Microsoft.Extensions.DependencyInjection
- Microsoft.Extensions.Options (Configuration)
The default usage are:
using BLun.ETagMiddleware;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// Required
// Add a Middleware for each Controller Request with
// algorithmus = SHA1 = default
// etag validator = Strong = default
// body content length = 40 * 1024 = default
services.AddETag();
}
// Add "app.UseETag();" to "Configure" method in Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStaticFiles();
// Add a Middleware for each Controller Request
// Atention: add app.UseETag after app.UseStaticFiles, the order is important for performance
app.UseETag();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
You can configuratione your own option prameters:
using BLun.ETagMiddleware;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// Required
// Add ETagOption with own global configurations
services.AddETag(new ETagOption()
{
// algorithmus
// SHA1 = default
// SHA265
// SHA384
// SHA512
// MD5
ETagAlgorithm = ETagAlgorithm.SHA265,
// etag validator
// Strong = default
// Weak
ETagValidator = ETagValidator.Weak,
// body content length
// 40 * 1024 = default
BodyMaxLength = 20 * 1024
});
}
// Add "app.UseETag();" to "Configure" method in Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStaticFiles();
// Add a Middleware for each Controller Request
// Atention: add app.UseETag after app.UseStaticFiles, the order is important
app.UseETag();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
using BLun.ETagMiddleware;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
// Add ETagOption with own global configurations
services.AddETag(new ETagOption()
{
// algorithmus
// SHA1 = default
// SHA265
// SHA384
// SHA512
// MD5
ETagAlgorithm = ETagAlgorithm.SHA265,
// etag validator
// Strong = default
// Weak
ETagValidator = ETagValidator.Weak,
// body content length
// 40 * 1024 = default
BodyMaxLength = 20 * 1024
});
}
// Add "app.UseETag();" to "Configure" method in Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseStaticFiles();
// Add a Middleware for each Controller Request
// Atention: add app.UseETag after app.UseStaticFiles, the order is important
// deactivate or combine with Middlewar
// the EtagAttributes didn't need the Middleware
// app.UseETag();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
// Can add on controller
[ETag()]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
// Can add on methods
[ETag(ETagValidator = ETagValidator.Weak)]
public IActionResult About()
{
ViewData["Message"] = "Your application description page.";
return View();
}
[ETag(ETagValidator = ETagValidator.Strong, BodyMaxLength = 30 * 1024, ETagAlgorithm = ETagAlgorithm.SHA384)]
public IActionResult Contact()
{
ViewData["Message"] = "Your contact page.";
return View();
}
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
The Code is unittestet.
I would develope muche more test for it.