When you want to use a fast middleware,you can use ( pun intended)
app.Use(
However,if you want to use some of scoped services,e.g.
app.Use(async (context,next) =>
{
var st= app.Services.GetRequiredService<IServerTiming>();//code
}
then it gives an error
Cannot resolve scoped service from root provider
For this you should create a scope:
app.Use(async (context,next) =>
{
//var st= app.Services.GetRequiredService<IServerTiming>();
using var sc = app.Services.CreateScope();
var st = sc.ServiceProvider.GetRequiredService<IServerTiming>();
st.AddMetric((decimal)0.002,”yrequest”);
await next(context);
});
However,that means it will NOT be the same scope as the original app . How we can have the same scope ? By using the middleware
public class ServerTiming : IMiddleware
{
private readonly IServerTiming serverTiming;public ServerTiming(IServerTiming serverTiming)
{
this.serverTiming = serverTiming;
}
public async Task InvokeAsync(HttpContext context,RequestDelegate next)
{
this.serverTiming.AddMetric((decimal)0.001,”startRequest”);
await next(context);
}
}
and registering ( code for .net 6,you can easy make it for .net <6 )
builder.Services.AddScoped<ServerTiming>();
var app = builder.Build();
app.UseMiddleware<ServerTiming>();
This way we are sure that we have the same scoped data.
Leave a Reply