using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using Microsoft.AspNetCore.Server.Kestrel.Core; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using Quartz.Impl; using Quartz; using VolPro.Core.CacheManager; using VolPro.Core.Configuration; using VolPro.Core.Dapper; using VolPro.Core.Filters; using VolPro.Core.Middleware; using VolPro.Core.ObjectActionValidator; using VolPro.Core.Quartz; using VolPro.Core.Extensions; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Http; using VolPro.Core.Controllers.Basic; using VolPro.Core.Language; using VolPro.WebApi.Controllers.Hubs; using System.Net; using VolPro.WebApi; using VolPro.Core.SignalR; using VolPro.Core.DbSqlSugar; using VolPro.Core.WeChat; using VolPro.Core.Log; using VolPro.Core.PerformanceMonitor; using VolPro.Core.BackgroundServices; var builder = WebApplication.CreateBuilder(args); builder.Services.AddModule(builder.Configuration); builder.Services.UseSqlSugar(); //微信登录 builder.Services.AddScoped(); // 添加消息推送后台服务 builder.Services.AddHostedService(); //添加微信公众号推送后台服务 builder.Services.AddScoped(); builder.Services.AddSingleton(); //添加微信公众号推送后台服务 builder.Services.AddHostedService(); // 添加消息服务 builder.Services.AddSingleton(); // 添加消息服务 builder.Services.AddSingleton(); //注册审计日志 builder.Services.AddActionLog(); // 添加服务器监控后台服务 builder.Services.AddMonitor(builder);//这里添加后注意右键引用下命名空间 //统一注册后台服务 builder.AddBackgroundServices();//这里添加后注意右键引用下命名空间 builder.Services .AddControllers() //https://learn.microsoft.com/zh-cn/aspnet/core/web-api/jsonpatch?view=aspnetcore-8.0 //需要安装Microsoft.AspNetCore.Mvc.NewtonsoftJson包 .AddNewtonsoftJson(op => { op.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(); op.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; op.SerializerSettings.Converters.Add(new LongCovert()); }); DapperParseGuidTypeHandler.InitParseGuid(); builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { SaveSigninToken = true,//保存token,后台验证token是否生效(重要) ValidateIssuer = true,//是否验证Issuer ValidateAudience = true,//是否验证Audience ValidateLifetime = true,//是否验证失效时间 ValidateIssuerSigningKey = true,//是否验证SecurityKey ValidAudience = AppSetting.Secret.Audience,//Audience ValidIssuer = AppSetting.Secret.Issuer,//Issuer,这两项和前面签发jwt的设置一致 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(AppSetting.Secret.JWT)) }; options.Events = new JwtBearerEvents() { OnChallenge = context => { context.HandleResponse(); context.Response.Clear(); context.Response.ContentType = "application/json"; context.Response.StatusCode = 401; context.Response.WriteAsync(new { message = "授权未通过", status = false, code = 401 }.Serialize()); return Task.CompletedTask; } }; }); //builder.Services.AddCors(); //builder.Services.AddCors(options => //{ // options.AddDefaultPolicy( // builder => // { // builder.AllowAnyOrigin() // .SetPreflightMaxAge(TimeSpan.FromSeconds(2520)) // .AllowAnyHeader().AllowAnyMethod(); // }); //}); builder.Services.AddCors(options => { options.AddPolicy("cors", builder => { builder.SetIsOriginAllowed(_ => true) .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); }); }); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "volpro.core.api", Version = "v1" }); var security = new Dictionary> { { AppSetting.Secret.Issuer, new string[] { } } }; c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme() { Description = "JWT授权token前面需要加上字段Bearer与一个空格,如Bearer token", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, BearerFormat = "JWT", Scheme = "Bearer" }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme{ Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }}, new string[] { } } }); }) .AddControllers() .ConfigureApiBehaviorOptions(options => { options.SuppressConsumesConstraintForFormFileParameters = true; options.SuppressInferBindingSourcesForParameters = true; options.SuppressModelStateInvalidFilter = true; options.SuppressMapClientErrors = true; options.ClientErrorMapping[404].Link = "https://*/404"; }); builder.Services.AddSignalR(); builder.Services.AddHttpClient() .AddHttpContextAccessor() .AddMemoryCache() .AddTransient() .AddSingleton() .AddSingleton() .AddSingleton(); builder.Services.AddMvc(options => { options.Filters.Add(typeof(ApiAuthorizeFilter)); options.Filters.Add(typeof(ActionExecuteFilter)); }); var startup = new Startup(builder.Configuration); startup.ConfigureContainer(); builder.Services.UseMethodsModelParameters().UseMethodsGeneralParameters(); builder.Services.AddSingleton(new NullObjectModelValidator()); //Swagger builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.WebHost.UseUrls("http://*:9100"); builder.Services.Configure(x => { x.MultipartBodyLengthLimit = 1024 * 1024 * 100; }).Configure(options => { options.Limits.MaxRequestBodySize = 1024 * 1024 * 100; }).Configure(options => { options.MaxRequestBodySize = 1024 * 1024 * 100; }); var app = builder.Build(); //正式环境如果要关闭swgger,请注释下面三行代码 app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(); if (app.Environment.IsDevelopment()) { //app.UseDeveloperExceptionPage(); //app.UseSwagger(); //app.UseSwaggerUI(); } else { //定时任务,如果需要本地执行定时任务,请将此代码放在else外面 app.UseQuartz(app.Environment); } app.UseLanguagePack().UseMiddleware(); app.UseMiddleware(); app.UseDefaultFiles(); app.UseStaticFiles().UseStaticFiles(new StaticFileOptions { ServeUnknownFileTypes = true }); app.Use(HttpRequestMiddleware.Context); string _uploadPath = (app.Environment.ContentRootPath + "/Upload").ReplacePath(); if (!Directory.Exists(_uploadPath)) { Directory.CreateDirectory(_uploadPath); } app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), @"Upload")), RequestPath = "/Upload", OnPrepareResponse = (Microsoft.AspNetCore.StaticFiles.StaticFileResponseContext staticFile) => { } }); //配置HttpContext app.UseStaticHttpContext(); // Configure the HTTP request pipeline. //if (app.Environment.IsDevelopment()) //{ app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1"); options.RoutePrefix = string.Empty; }); //} app.UseCors("cors"); app.UseCors(); // 使用 HTTPS 重定向 //app.UseHttpsRedirection(); // 使用路由 app.UseRouting(); app.UseAuthorization(); app.MapControllers(); //app.MapHub("/message"); app.MapHub("/hub/message"); app.MapHub("/performanceMonitorSignalR"); app.MapControllers(); app.Run();