Retarder- idea and POC–part 1
I was thinking about a new project in .NET Core – Retarder ( Delayer seems to be better , but I digress ). What about a middleware in .NET Core, that delays execution of any request with 1 second ( or something between 1 millisecond and 1 second )? That way , if someone wants to improve the project , just remove the Retarder !
Other ( better ) uses are :
- Delay execution of some endpoints, based on how frequent are their uses
- Delay execution based on headers / query string / routes
- Delay execution based on client IP
- Delay execution based on the response
But for the moment just stick with the static delay of all requests.
Seems to be a good idea to play with middleware. I started a new .NET Core 3.1 project and started coding .
You can find the first version at tag : https://github.com/ignatandrei/NetCoreRetarder/commits/version_1_just_data
The code for Retarder middleware is
using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace NetCoreRetarder { public class RetarderMiddleware : IMiddleware { public RetarderMiddleware() { } public async Task InvokeAsync(HttpContext context, RequestDelegate next) { var random = new Random(); //var awaitMilliseconds =random.Next(10000, 100000); var awaitMilliseconds = random.Next(1, 1000); Console.WriteLine($"awaiting {awaitMilliseconds}"); await Task.Delay(awaitMilliseconds); Console.WriteLine($"***awaited {awaitMilliseconds}"); await next(context); } } }
The code for using Retarder is:
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; namespace NetCoreRetarder { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddControllers(); //what if we comment this ? //services.AddSingleton<RetarderMiddleware>(); services.AddTransient<RetarderMiddleware>(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseAuthorization(); //app.UseMiddleware(typeof(RetarderMiddleware)); app.UseMiddleware<RetarderMiddleware>(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } }
Some questions :
1. What is the difference if we have services.AddSingleton vs services.AddTransient for the middleware ?
2. What if we comment both ?
3. What if we do call later ( or before ) app.UseMiddleware ?
Leave a Reply