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