代码拉取完成,页面将自动刷新
using AdminAPI.Filters;
using AdminAPI.Libraries;
using AdminAPI.Models.AppSetting;
using Common;
using DistributedLock.Redis;
using Logger.DataBase;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using System.Security.Cryptography;
namespace AdminAPI
{
public class Program
{
public static void Main(string[] args)
{
EnvironmentHelper.ChangeDirectory(args);
var builder = WebApplication.CreateBuilder(args);
builder.Host.UseWindowsService();
#region 启用 Kestrel Https 并绑定证书
//builder.WebHost.UseKestrel(options =>
//{
// options.ConfigureHttpsDefaults(options =>
// {
// options.ServerCertificate = new System.Security.Cryptography.X509Certificates.X509Certificate2(Path.Combine(AppContext.BaseDirectory, "xxxx.pfx"), "123456");
// });
//});
//builder.WebHost.UseUrls("https://*");
#endregion
builder.Services.AddDbContextPool<Repository.Database.DatabaseContext>(options =>
{
options.UseNpgsql(builder.Configuration.GetConnectionString("dbConnection")!);
}, 30);
#region 基础 Server 配置
builder.Services.Configure<FormOptions>(options =>
{
options.MultipartBodyLengthLimit = long.MaxValue;
});
builder.Services.Configure<KestrelServerOptions>(options =>
{
options.AllowSynchronousIO = true;
});
builder.Services.Configure<IISServerOptions>(options =>
{
options.AllowSynchronousIO = true;
});
builder.Services.AddHsts(options =>
{
options.MaxAge = TimeSpan.FromDays(365);
});
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
builder.Services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
});
#endregion
#region 注册 JWT 认证机制
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
var jwtSetting = builder.Configuration.GetRequiredSection("JWT").Get<JWTSetting>()!;
var issuerSigningKey = ECDsa.Create();
issuerSigningKey.ImportSubjectPublicKeyInfo(Convert.FromBase64String(jwtSetting.PublicKey), out int i);
options.TokenValidationParameters = new()
{
ValidIssuer = jwtSetting.Issuer,
ValidAudience = jwtSetting.Audience,
IssuerSigningKey = new ECDsaSecurityKey(issuerSigningKey)
};
});
builder.Services.AddAuthorization(options =>
{
options.DefaultPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().RequireAssertion(context => IdentityVerification.Authorization(context)).Build();
});
#endregion
//注册HttpContext
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
//注册全局过滤器
builder.Services.AddMvc(options => options.Filters.Add(new GlobalFilter()));
//注册跨域信息
builder.Services.AddCors(options =>
{
options.AddPolicy("cors", policy =>
{
policy.SetIsOriginAllowed(origin => true)
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()
.SetPreflightMaxAge(TimeSpan.FromSeconds(7200));
});
});
#region 注册 Json 序列化配置
builder.Services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new Common.JsonConverter.LongConverter());
});
#endregion
#region 注册 Swagger
builder.Services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", null);
var modelPrefix = "AdminShared.Models.";
options.SchemaGeneratorOptions = new() { SchemaIdSelector = type => (type.ToString()[(type.ToString().IndexOf("Models.") + 7)..]).Replace(modelPrefix, "").Replace("`1", "").Replace("+", ".") };
options.MapType<long>(() => new OpenApiSchema { Type = "string", Format = "long" });
options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, $"{typeof(Program).Assembly.GetName().Name}.xml"), true);
#region 开启 Swagger JWT 鉴权模块
options.AddSecurityDefinition("bearerAuth", new OpenApiSecurityScheme()
{
Type = SecuritySchemeType.Http,
Scheme = "bearer",
BearerFormat = "JWT"
});
options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new ()
{
Type = ReferenceType.SecurityScheme,
Id = "bearerAuth"
}
},
Array.Empty<string>()
}
});
#endregion
});
#endregion
//注册统一模型验证
builder.Services.Configure<ApiBehaviorOptions>(options =>
{
options.InvalidModelStateResponseFactory = actionContext =>
{
//获取验证失败的模型字段
var errors = actionContext.ModelState.Where(e => e.Value?.Errors.Count > 0).Select(e => e.Value?.Errors.First().ErrorMessage).ToList();
var dataStr = string.Join(" | ", errors);
//设置返回内容
var result = new
{
errMsg = dataStr
};
return new BadRequestObjectResult(result);
};
});
//注册雪花ID算法
builder.Services.AddSingleton(new Common.IDHelper(0, 0));
//注册分布式锁 Redis模式
builder.Services.AddRedisLock(options =>
{
options.Configuration = builder.Configuration.GetConnectionString("redisConnection")!;
options.InstanceName = "lock";
});
//注册缓存服务 Redis模式
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = builder.Configuration.GetConnectionString("redisConnection");
options.InstanceName = "cache";
});
#region 注册HttpClient
builder.Services.AddHttpClient("", options =>
{
options.DefaultRequestVersion = new("2.0");
}).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
{
AllowAutoRedirect = false,
AutomaticDecompression = System.Net.DecompressionMethods.All
});
builder.Services.AddHttpClient("SkipSsl", options =>
{
options.DefaultRequestVersion = new("2.0");
}).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
{
AllowAutoRedirect = false,
AutomaticDecompression = System.Net.DecompressionMethods.All,
ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; }
});
#endregion
builder.Services.BatchRegisterServices();
#region 注册文件服务
//builder.Services.AddTencentCloudSMS(options =>
//{
// var settings = builder.Configuration.GetRequiredSection("TencentCloudSMS").Get<SMS.TencentCloud.Models.SMSSetting>()!;
// options.AppId = settings.AppId;
// options.SecretId = settings.SecretId;
// options.SecretKey = settings.SecretKey;
//});
//builder.Services.AddAliCloudSMS(options =>
//{
// var settings = builder.Configuration.GetRequiredSection("AliCloudSMS").Get<SMS.AliCloud.Models.SMSSetting>()!;
// options.AccessKeyId = settings.AccessKeyId;
// options.AccessKeySecret = settings.AccessKeySecret;
//});
#endregion
#region 注册日志服务
//注册数据库日志服务
builder.Logging.AddDataBaseLogger(options => { });
//注册本地文件日志服务
//builder.Logging.AddLocalFileLogger(options => { });
#endregion
var app = builder.Build();
app.UseForwardedHeaders();
//开启倒带模式允许多次读取 HttpContext.Body 中的内容
app.Use(async (context, next) =>
{
context.Request.EnableBuffering();
await next.Invoke();
});
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseResponseCompression();
//注册全局异常处理机制
app.UseExceptionHandler(builder => builder.Run(async context => await GlobalError.ErrorEvent(context)));
}
app.UseHsts();
//注册跨域信息
app.UseCors("cors");
//强制重定向到Https
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
//注册用户认证机制,必须放在 UseCors UseRouting 之后
app.UseAuthentication();
app.UseAuthorization();
//注入 adminapp 项目
//app.MapWhen(ctx => ctx.Request.Path.Value.ToLower().Contains("/admin"), adminapp =>
//{
// adminapp.UseStaticFiles("/admin");
// adminapp.UseBlazorFrameworkFiles("/admin");
// adminapp.UseEndpoints(endpoints =>
// {
// endpoints.MapFallbackToFile("/admin/{*path:nonfile}", "admin/index.html");
// });
//});
app.MapControllers();
#region 启用 Swagger
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint($"/swagger/v1/swagger.json", null);
});
#endregion
app.Run();
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。