/// <summary> /// </summary> /// <param name="services"></param> // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { //efcore cache services.AddEFSecondLevelCache(options => { //options.UseEasyCachingCoreProvider(EasyCachingConstValue.DefaultHybridName, true);//内存和redis混合 options.UseEasyCachingCoreProvider(EasyCachingConstValue.DefaultInMemoryName, false); //内存 options.CacheAllQueries(CacheExpirationMode.Sliding, TimeSpan.FromDays(1)); //Sliding 滑动 Absolute 绝对 }); // More info: https://easycaching.readthedocs.io/en/latest/Redis/ services.AddEasyCaching(options => { // use memory cache with your own configuration options.UseInMemory(); options.UseRedis(config => { config.DBConfig.AllowAdmin = true; config.DBConfig.Endpoints.Add(new EasyCaching.Core.Configurations.ServerEndPoint(Configuration["Redis:Host"], int.Parse(Configuration["Redis:Port"]))); config.DBConfig.Password = Configuration["Redis:Password"]; config.DBConfig.IsSsl = bool.Parse(Configuration["Redis:IsSsl"]); }); // 使用hybird options.UseHybrid(config => { config.LocalCacheProviderName = EasyCachingConstValue.DefaultInMemoryName; config.DistributedCacheProviderName = EasyCachingConstValue.DefaultRedisName; config.TopicName = "test_topic"; }); // 使用redis作为缓存总线 options.WithRedisBus(config => { config.AllowAdmin = true; config.Endpoints.Add(new EasyCaching.Core.Configurations.ServerEndPoint(Configuration["Redis:Host"], int.Parse(Configuration["Redis:Port"]))); config.Password = Configuration["Redis:Password"]; config.IsSsl = bool.Parse(Configuration["Redis:IsSsl"]); config.Database = 6; }); }); //sql server services.AddDbContextPool <ApplicationDbContext>((serviceProvider, optionsBuilder) => optionsBuilder.UseLazyLoadingProxies().UseSqlServer(Configuration["ConnectionStrings:DbServerConnection"], c => c.EnableRetryOnFailure().MigrationsAssembly("Web")).AddInterceptors(serviceProvider.GetRequiredService <SecondLevelCacheInterceptor>()).EnableSensitiveDataLogging()); //dapper services.AddScoped <IDbConnection>(e => new SqlConnection(Configuration["ConnectionStrings:DbServerConnection"])); services.AddIdentity <IdentityUser, IdentityRole>().AddEntityFrameworkStores <ApplicationDbContext>().AddDefaultTokenProviders(); // Configure Identity services.Configure <IdentityOptions>(options => { // Password settings options.Password.RequireDigit = true; options.Password.RequiredLength = 8; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.Password.RequireLowercase = false; // Lockout settings options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30); options.Lockout.MaxFailedAccessAttempts = 10; }); services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All)); services.AddScoped <DbContext, ApplicationDbContext>(); services.AddScoped <IUnitOfWork, UnitOfWork>(); // Add application services. services.AddTransient <IKeyStoreService, InMemoryKeyStoreService>(); services.AddTransient <IEmailSender, EmailSender>(); //services.AddTransient<ISmsSender, SmsSender>(); services.AddTransient <IUserInfo, UserInfo>(); services.AddTransient <IUserAuthorize, UserAuthorize>(); services.AddTransient <IDapperRepository, DapperRepository>(); services.AddTransient <ISysLogService, SysLogService>(); services.AddTransient <ISysAreaService, SysAreaService>(); services.AddTransient <ISysControllerService, SysControllerService>(); services.AddTransient <ISysActionService, SysActionService>(); services.AddTransient <ISysHelpService, SysHelpService>(); services.AddTransient <ISysHelpClassService, SysHelpClassService>(); services.AddTransient <ISysRoleService, SysRoleService>(); services.AddTransient <ISysUserRoleService, SysUserRoleService>(); services.AddTransient <ISysUserLogService, SysUserLogService>(); services.AddTransient <ISysRoleSysControllerSysActionService, SysRoleSysControllerSysActionService>(); services.AddTransient <ISysControllerSysActionService, SysControllerSysActionService>(); services.AddTransient <ISysDepartmentService, SysDepartmentService>(); services.AddTransient <ITaskCenterService, TaskCenterService>(); services.AddTransient <ISysMessageCenterService, SysMessageService>(); services.AddTransient <ISysMessageReceivedService, SysMessageReceivedService>(); services.AddTransient <IMessengerHub, MessengerHub>(); services.AddTransient <IHolidayService, HolidayService>(); services.AddTransient <IJsonDataService, JsonDataService>(); services.AddTransient <IJsonDataHistoryService, JsonDataHistoryService>(); services.AddTransient <ICityCodeService, CityCodeService>(); services.AddTransient <IDomainLabelService, DomainLabelService>(); services.AddTransient <ISysUserService, SysUserService>(); services.AddTransient <ISysDepartmentSysUserService, SysDepartmentSysUserService>(); services.AddTransient <IResInfo, ResInfo>(); services.AddSingleton <IHostedService, Worker>();//计划任务 services.AddCors(options => options.AddPolicy("全部允许", p => p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()) ); // 防止跨站请求 services.AddAntiforgery(); services.AddDatabaseDeveloperPageExceptionFilter(); services.AddAuthentication(options => { } ) .AddCookie(options => { }) .AddJwtBearer(options => { options.RequireHttpsMetadata = false; options.SaveToken = true; options.TokenValidationParameters = new TokenValidationParameters() { ValidateIssuer = true, ValidIssuer = "evan", ValidateAudience = true, ValidAudience = "evan", ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("AAAAAA0000000000000")), ValidateLifetime = true, ClockSkew = TimeSpan.Zero }; }); services.AddMvc(a => { // 异常处理 a.Filters.Add(typeof(ExceptionFilter)); // 身份验证 a.Filters.Add(new UserAuthorizeFilter(new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build())); // 记录action 日志 a.Filters.Add(typeof(UserLogFilter)); // a.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()); //webapi 暂不知怎么处理 也会拦截 }) .AddDataAnnotationsLocalization(options => { options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(ExpressLocalizationResource)); }) .AddMvcLocalization(options => { options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(ExpressLocalizationResource)); }) .SetCompatibilityVersion(CompatibilityVersion.Latest); services.Configure <EmailConfig>(Configuration.GetSection("EmailConfig")); services.Configure <AdministratorContact>(Configuration.GetSection("AdministratorContact")); services.AddSignalR(); services.AddHealthChecks(); services.AddControllersWithViews().AddDapr().AddRazorRuntimeCompilation().AddNewtonsoftJson(options => { options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; options.SerializerSettings.ContractResolver = new DefaultContractResolver(); }); services.AddSwaggerGen(c => { c.EnableAnnotations(); c.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1", Contact = new OpenApiContact { Name = "樊书译", Email = "*****@*****.**" }, License = new OpenApiLicense { Name = Configuration["Copyright"] } }); //c.AddSecurityDefinition("ApiKey", new OpenApiSecurityScheme() { In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, Name = "X-API-KEY" }); //c.AddSecurityRequirement(new OpenApiSecurityRequirement //{ // { // new OpenApiSecurityScheme // { // Reference = new OpenApiReference // { // Type = ReferenceType.SecurityScheme, // Id = "ApiKey" // } // }, // Array.Empty<string>() // } //}); c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Description = "Login 用户登录接口获取 Token,例如:“eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9*********”", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.Http, Scheme = "Bearer" }); c.AddSecurityRequirement(new OpenApiSecurityRequirement() { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }, }, new List <string>() } }); c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "Web.xml")); }); services.AddGrpc(); services.AddRazorPages(); services.AddServerSideBlazor(); services.AddDatabaseDeveloperPageExceptionFilter(); }
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.TryAddSingleton <IHttpContextAccessor, HttpContextAccessor>(); services.TryAddSingleton <IActionResultExecutor <ResultBase>, ResultBaseExecutor>(); services.AddMemoryCache(); services.AddDistributedMemoryCache(); services.AddSession(); services.AddSingleton(HtmlEncoder.Create(UnicodeRanges.All)); services.AddAuthentication().AddCookie(AdminCookieAttribute.Scheme, o => { o.ClaimsIssuer = AdminCookieAttribute.ClaimsIssuer; o.LoginPath = new PathString("/Admin/Login"); o.Cookie.SameSite = SameSiteMode.Unspecified; o.Cookie.SecurePolicy = CookieSecurePolicy.None; o.Events = new CookieAuthenticationEvents { OnValidatePrincipal = async context => { var admin = AdminCookieAttribute.GetLoginAdmin(context.Principal.Claims); if (admin == null || admin.Id.ToInt() <= 0) { await AdminValidateFail(context); return; } AdminCookieAttribute.SetLoginAdmin(admin); } }; }); services.AddControllersWithViews(options => { options.InputFormatters.Insert(0, new JsonInputFormatter()); }); services.AddRazorPages().AddRazorRuntimeCompilation(); var baseType = typeof(IModuleInitializer); var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory; var referencedAssemblies = System.IO.Directory.GetFiles(path, "*.dll").ToList().FindAll(temp => { string fileName = Path.GetFileName(temp); return(fileName.StartsWith("CMS.Modules")); }).Select(Assembly.LoadFrom).ToArray(); var types = referencedAssemblies .SelectMany(a => a.DefinedTypes) .Select(type => type.AsType()) .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray(); var implementTypes = types.Where(x => x.IsClass).ToArray(); foreach (var implementType in implementTypes) { services.AddSingleton(baseType, implementType); } var sp = services.BuildServiceProvider(); var moduleInitializers = sp.GetServices <IModuleInitializer>(); foreach (var moduleInitializer in moduleInitializers) { moduleInitializer.ConfigureServices(services); } }