NET Core 3.1中的中间件中使用autofac注入服务无法正常工作

问题描述

我已将我的应用程序从2.2 .NET核心升级到3.1 .NET核心。我有一个中间件,并且注入了一种服务,该服务在2.2中工作,但是在Autofac的3.1 .NET核心中不起作用。

 public partial class TokenManagerMiddelware : IMiddleware
{
    #region Fields
    private readonly ITokenManagerService _tokenManagerService;
    #endregion

    #region Ctor
    public TokenManagerMiddelware(ITokenManagerService tokenManagerService)
    {
        _tokenManagerService = tokenManagerService;
    }
    #endregion
    public async Task InvokeAsync(HttpContext context,RequestDelegate next)
    {
       // var _tokenManagerService = context.RequestServices.GetrequiredService<ITokenManagerService>();
        if (_tokenManagerService.IsCurrentActivetoken())
        {
            await next(context);
            return;
        }
        context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
    }
}
public static class TokenManagerMiddelwareExtention
{
    public static IApplicationBuilder UsetokenManagerMiddelware(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<TokenManagerMiddelware>();
    }
}

我也尝试过

var _tokenManagerService = context.RequestServices.GetrequiredService<ITokenManagerService>

我在Autofac中遇到错误

DependencyResolutionException:对于类型为“ THub.Framework.Token.TokenManagerMiddelware”的“ Autofac.Core.Activators.Reflection.DefaultConstructorFinder”找不到的构造函数,不能使用可用的服务和参数来调用: 无法解析构造函数'Void .ctor(THub.Services.Tokemmanager.ITokenManagerService)'的参数'THub.Services.Tokemmanager.ITokenManagerService tokenManagerService'。 Autofac.Core.Activators.Reflection.ReflectionActivator.GetValidConstructorBindings(ConstructorInfo [] availableConstructors,IComponentContext context,IEnumerable parameters)

DependencyResolutionException:激活THub.Framework.Token.TokenManagerMiddelware时引发了异常。 Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable参数,out对象decoratorTarget)

更新1 Program.cs

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace CoreApi
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

启动。

    using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FirebaseAdmin;
using Google.Apis.Auth.OAuth2;
using Hangfire;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.ResponseCompression;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json.Serialization;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using Swashbuckle.AspNetCore.Swagger;
using Microsoft.OpenApi.Models;
using THub.Core.Caching;
using THub.Core.Data;
using THub.Data;
using THub.Framework.Infrastructure.Extensions;
using THub.Framework.Token;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.FileProviders;
using THub.Services.Tokemmanager;

namespace CoreApi
{
    public class Startup
    {
        public Startup(IConfiguration configuration,IWebHostEnvironment webHostEnvironment)
        {
            Configuration = configuration;
            _webHostEnvironment = webHostEnvironment;
        }

        public IConfiguration Configuration { get; }
        public IWebHostEnvironment _webHostEnvironment;

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<THubObjectContext>(options =>
            {
                options.UsesqlServer(Configuration.GetConnectionString("DefaultConnection")).UseLazyLoadingProxies()
                .EnableSensitiveDataLogging();
            });
            services.AddHttpClient();
            //Servies Regsters
            services.AddIdentity<ApplicationUser,IdentityRole>()
                .AddEntityFrameworkStores<THubObjectContext>()
                .AddDefaultTokenProviders();
            services.AddApiVersioning(options =>
            {
                options.ReportApiVersions = true;
                options.AssumeDefaultVersionWhenUnspecified = true;
                options.DefaultApiVersion = new ApiVersion(1,0);

            });
            JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();


            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

            })

                .AddJwtBearer(options =>
                {
                    options.RequireHttpsMetadata = false;
                    options.Savetoken = true;
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuer = true,ValidateAudience = true,ValidateLifetime = true,ValidateIssuerSigningKey = true,Validissuer = Configuration["Jwt:Issuer"],ValidAudience = Configuration["Jwt:Issuer"],IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))

                    };
                });
            services.AddTransient<IDbContext,THubObjectContext>();
            services.AddScoped(typeof(IRepository<>),typeof(EfRepository<>));
            //services.AddTransient<ITokenManagerService,TokenManagerService>();
            services.Configure<MongoDBDatabaseSetting>(Configuration.GetSection(nameof(MongoDBDatabaseSetting)));
            services.AddSingleton<IMongoDBDatabaseSetting>(sp =>
               sp.GetrequiredService<IOptions<MongoDBDatabaseSetting>>().Value);
            services.AddMvc().AddNewtonsoftJson(options =>
            {
                options.SerializerSettings.ContractResolver = new DefaultContractResolver();
            });
           
            services.AddTransient<TokenManagerMiddelware>();
            services.Configure<FormOptions>(x =>
            {
                x.ValueLengthLimit = int.MaxValue;
                x.MultipartBodyLengthLimit = int.MaxValue; // In case of multipart
            });

            services.AddCors(options =>
            {
                options.AddPolicy("AllowCors",builder =>
                    {
                        builder.AllowAnyOrigin()
                        .AllowAnyHeader()
                        .AllowAnyMethod();
                        //.AllowCredentials();
                        //builder.WithOrigins("http://localhost:4200")
                        //        .AllowAnyHeader()
                        //        .AllowAnyMethod();

                    });
            });
            //Hangfire service
            services.AddHangfire(option => option.UsesqlServerStorage(Configuration.GetConnectionString("DefaultConnection"),new Hangfire.sqlServer.sqlServerStorageOptions
            {
                CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),QueuePollInterval = TimeSpan.Zero,UseRecommendedisolationLevel = true,disableGlobalLocks = true
            }));
            services.AddHangfireServer();


            services.AddSwaggerGen(options =>
            {

                options.SwaggerDoc("v1",new OpenApiInfo
                {
                    Title = "Core API V1",Version = "V1",Contact = new OpenApiContact
                    {
                        Name = "Error Sheet",Email = string.Empty,Url = new Uri("http://xxxx.com/ErrorSheet.xlsx"),}
                });
                options.AddSecurityDeFinition("Bearer",new OpenApiSecurityScheme
                    {
                        In = ParameterLocation.Header,Description = "Please enter into field the word 'Bearer' following by space and JWT",Name = "Authorization",Type = SecuritySchemeType.ApiKey
                    });
                options.AddSecurityRequirement(new OpenApiSecurityRequirement() {
                             {
                                new OpenApiSecurityScheme
                                {
                                    Description = "Adds token to header",Type = SecuritySchemeType.Http,In = ParameterLocation.Header,Scheme = "bearer",Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme,Id = "Bearer" }
                                },new List<string>()
                            }
                    });

            });
            services.Configure<IdentityOptions>(options =>
            {
                //Password Setting // Setting Change deu to Management saying to make it easy.
                options.Password.requiredigit = true; //Default true
                options.Password.RequireLowercase = true;//Default true
                options.Password.RequireNonAlphanumeric = true;//Default true
                options.Password.RequireUppercase = true;//Default true
                options.Password.requiredLength = 8; ////Default 8
                options.Password.requiredUniqueChars = 1;//Default 1

                // Lockout settings.  
                options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
                options.Lockout.MaxFailedAccessAttempts = 5;
                options.Lockout.AllowedForNewUsers = true;//Default true
                options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMnopQRSTUVWXYZ0123456789-._@+";
                options.User.RequireUniqueEmail = true;


            });

            /*--------------------FCM Admin SDK---------------------------------- */


            var filePath = Configuration.GetSection("GoogleFirebase")["fileName"];
            var googleCredential = Path.Combine(_webHostEnvironment.ContentRootPath,filePath);
            var credential = GoogleCredential.FromFile(googleCredential);

            FirebaseApp.Create(new AppOptions()
            {
                
                Credential = credential,});
            /*-----------------------------Cloude Sdk------------------------------------------*/
            //var gcpPath = Configuration.GetSection("GoogleCloudStorage")["fileName"];
            //var gcpCredential = Path.Combine(_hostingEnvironment.ContentRootPath,gcpPath);
            //var gcpstorageCredential = GoogleCredential.FromFile(gcpCredential);
            //  var gcpstorage = StorageClient.Create(gcpstorageCredential);



            //Mini profiler

            services.AddMiniProfiler(options =>
            {
                options.RouteBasePath = "/profiler";
                //options.Storage = new StackExchange.Profiling.Data.ProfiledDbConnection(Configuration.GetConnectionString("DefaultConnection"));
                //(options.Storage as MemoryCacheStorage).CacheDuration = TimeSpan.FromDays(30);
                //options.Storage = new StackExchange.Profiling.Storage.sqlServerStorage(Configuration.GetConnectionString("DefaultConnection"),"MiniProfiler","MiniProfilerTimings","MiniProfilerClientTimings");
                //options.sqlFormatter = new StackExchange.Profiling.sqlFormatters.InlineFormatter();
            });
            //services.AddApplicationInsightsTelemetry();
            // Configure Compression level
            services.Configure<GzipCompressionProviderOptions>(options => options.Level = CompressionLevel.Fastest);

            // Add Response compression services
            services.AddResponseCompression(options =>
            {
                options.Providers.Add<GzipCompressionProvider>();
            });
            services.AddControllers();
            services.Configureapplicationservices(Configuration,_webHostEnvironment);

        }

        // 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.UseCors();
            app.UseStaticFiles();
            app.UseStaticFiles(new StaticFileOptions
            {
                FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(),"Upload")),RequestPath = "/Upload"
            });
            app.UseResponseCompression();
            app.UseSwagger();
            app.UseSwaggerUI(options =>
            {
                options.SwaggerEndpoint("/swagger/v1/swagger.json","Core API V1");
            });
            app.UseHttpsRedirection();
            app.UseAuthentication();
            app.UseRouting();

            app.UseAuthorization();

            //app.UseMiddleware<TokenManagerMiddelware>();
            app.UsetokenManagerMiddelware();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });

        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)