问题描述
我已将我的应用程序从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 (将#修改为@)