Problem
How to compress responses in ASP.NET Core.
Solution
To an empty project, configure services and middleware for compression in Startup.
- public void ConfigureServices(
- IServiceCollection services)
- {
- services.AddResponseCompression();
-
- services.AddMvc();
- }
-
- public void Configure(
- IApplicationBuilder app,
- IHostingEnvironment env)
- {
- app.UseResponseCompression();
-
- app.UseMvcWithDefaultRoute();
- }
Add a Home Controller with Index action and write some data to the View.
ASP.NET Core Response Compression
- @for(int i = 0; i < 10000; i++)
- {
- Testing Response Compression: @i
- }
Notice the size and time of response before and after compression.
Discussion
When you’re unable to use the compression features of web servers (IIS, Apache, Nginx), ASP.NET Core provides an alternate option, Response Compression middleware. Its performance won’t match the server-based compression features though.
The client will send "Accept-Encoding" header in its request to indicate the compression capabilities. The server will respond with Content-Encoding, indicating the compression used. Response Compression middleware supports gzip compression by default.
Compression Level
The default level of compression is the fastest way to compress as quickly as possible. You could change to Optimal for maximum compression.
- services.Configure(options =>
- {
- options.Level = CompressionLevel.Optimal;
- });
-
- services.AddResponseCompression(options =>
- {
- options.Providers.Add();
- });
However, notice the size and time! It took more than 1 second (compared to Fastest level) but we didn’t gain a lot in terms of size (0.4kb). You’ll need to test on an actual website to decide the appropriate level.
HTTPS Compression
Compression can be enabled for HTTPS by using EnableForHttps, however, this could lead to security issues.
- services.AddResponseCompression(options =>
- {
- options.EnableForHttps = true;
- });
Source Code
GitHub