无法解析来自根提供程序的作用域服务 dbcontext

Cannot resolve scoped service dbcontext from root provider

我创建了一个 API 日志记录中间件来记录对数据库和 Azure Microsoft insight 的请求,但是由于某种原因,找不到数据库上下文的依赖注入(无法解析来自根提供程序的作用域服务) .

API 日志中间件

public class APILoggingMiddleware
{
    private readonly TelemetryClient _telemetry;

    private readonly ILogger _logger;

    private readonly RequestDelegate _next;

    private APIsAuditContext db;

    public static IConfiguration _configuration;
    public APILoggingMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, TelemetryClient telemetry, IConfiguration configuration, APIsAuditContext dbContext)
    {
        _configuration = configuration;

        _telemetry = telemetry;

        _next = next;

        _logger = loggerFactory.CreateLogger<APILoggingMiddleware>();

        db = dbContext;
    }

    //static class to simplify adding the middleware to the application’s pipeline

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        finally
        {

            Task logReq = logRequest(context);
            Task lodRes = logResponse(context);
        }
     }
  }

数据库上下文

public class APIsAuditContext : DbContext
{
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
        }
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
    }
    public APIsAuditContext(DbContextOptions<APIsAuditContext> options) : base(options) { }
    public DbSet<APIsRequestsAudit> APIsRequestsAudits { get; set; }


}

启动

 public class Startup
{
    public IConfiguration _configuration { get; }

    public Startup(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddDbContext<APIsAuditContext>(options => options.UseSqlServer(_configuration["ConnectionStrings:APIAuditConnection"]));

        services.AddApplicationInsightsTelemetry();
        services.AddControllers();
        services.AddMvc();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {

        //Pipeline to API Logging 
        app.UseRequestResponseLogging();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();
        app.UseRouting();
        app.UseAuthorization();

        app.UseEndpoints(endpoints => 
        {
            endpoints.MapControllers();
        });



    }
}

有人可以帮忙吗?

根据https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/write?view=aspnetcore-3.1#per-request-middleware-dependencies,您必须在 Invoke 方法中注入作用域服务:

public class CustomMiddleware
{
    private readonly RequestDelegate _next;

    public CustomMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    // IMyScopedService is injected into Invoke
    public async Task Invoke(HttpContext httpContext, IMyScopedService svc)
    {
        svc.MyProperty = 1000;
        await _next(httpContext);
    }
}