【修复】修复项目多个文件编码为gb2312,导致vs code或者mac下出现乱码的情况。

This commit is contained in:
JianWeie
2022-09-28 10:51:41 +08:00
parent 07cde1f2c2
commit 62065457c4
4 changed files with 141 additions and 141 deletions

View File

@@ -1,4 +1,4 @@
using Autofac.Extensions.DependencyInjection; using Autofac.Extensions.DependencyInjection;
using CoreCms.Net.Loging; using CoreCms.Net.Loging;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
@@ -11,12 +11,12 @@ using System;
namespace CoreCms.Net.Web.Admin namespace CoreCms.Net.Web.Admin
{ {
/// <summary> /// <summary>
/// <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD> /// 初始化
/// </summary> /// </summary>
public class Program public class Program
{ {
/// <summary> /// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// 启动配置
/// </summary> /// </summary>
/// <param name="args"></param> /// <param name="args"></param>
public static void Main(string[] args) public static void Main(string[] args)
@@ -24,24 +24,24 @@ namespace CoreCms.Net.Web.Admin
var host = CreateHostBuilder(args).Build(); var host = CreateHostBuilder(args).Build();
try try
{ {
//ȷ<EFBFBD><EFBFBD>NLog.config<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>appsettings.json<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD> //确保NLog.config中连接字符串与appsettings.json中同步
NLogUtil.EnsureNlogConfig("NLog.config"); NLogUtil.EnsureNlogConfig("NLog.config");
//throw new Exception("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");//for test //throw new Exception("测试异常");//for test
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //其他项目启动时需要做的事情
NLogUtil.WriteAll(NLog.LogLevel.Trace, LogType.Web, "<EFBFBD><EFBFBD>վ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD>վ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>"); NLogUtil.WriteAll(NLog.LogLevel.Trace, LogType.Web, "网站启动", "网站启动成功");
host.Run(); host.Run();
} }
catch (Exception ex) catch (Exception ex)
{ {
//ʹ<EFBFBD><EFBFBD>nlogд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>ӳɹ<D3B3><C9B9><EFBFBD> //使用nlog写到本地日志文件(万一数据库没创建/连接成功)
NLogUtil.WriteFileLog(NLog.LogLevel.Error, LogType.Web, "<EFBFBD><EFBFBD>վ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", ex); NLogUtil.WriteFileLog(NLog.LogLevel.Error, LogType.Web, "网站启动", "初始化数据异常", ex);
throw; throw;
} }
} }
/// <summary> /// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD> /// 创建启动支撑
/// </summary> /// </summary>
/// <param name="args"></param> /// <param name="args"></param>
/// <returns></returns> /// <returns></returns>
@@ -50,8 +50,8 @@ namespace CoreCms.Net.Web.Admin
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) //<--NOTE THIS .UseServiceProviderFactory(new AutofacServiceProviderFactory()) //<--NOTE THIS
.ConfigureLogging(logging => .ConfigureLogging(logging =>
{ {
logging.ClearProviders(); //<EFBFBD>Ƴ<EFBFBD><EFBFBD>Ѿ<EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> logging.ClearProviders(); //移除已经注册的其他日志处理程序
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD> logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); //设置最小的日志级别
}) })
.UseNLog() //NLog: Setup NLog for Dependency injection .UseNLog() //NLog: Setup NLog for Dependency injection
.ConfigureWebHostDefaults(webBuilder => .ConfigureWebHostDefaults(webBuilder =>
@@ -59,7 +59,7 @@ namespace CoreCms.Net.Web.Admin
webBuilder webBuilder
.ConfigureKestrel(serverOptions => .ConfigureKestrel(serverOptions =>
{ {
serverOptions.AllowSynchronousIO = true;//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD> IO serverOptions.AllowSynchronousIO = true;//启用同步 IO
}) })
.UseStartup<Startup>(); .UseStartup<Startup>();
}); });

View File

@@ -1,4 +1,4 @@

using System.Linq; using System.Linq;
using Autofac; using Autofac;
using CoreCms.Net.Auth; using CoreCms.Net.Auth;
@@ -30,12 +30,12 @@ using Yitter.IdGenerator;
namespace CoreCms.Net.Web.Admin namespace CoreCms.Net.Web.Admin
{ {
/// <summary> /// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// 启动配置
/// </summary> /// </summary>
public class Startup public class Startup
{ {
/// <summary> /// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// 构造函数
/// </summary> /// </summary>
/// <param name="configuration"></param> /// <param name="configuration"></param>
/// <param name="env"></param> /// <param name="env"></param>
@@ -59,108 +59,108 @@ namespace CoreCms.Net.Web.Admin
/// <param name="services"></param> /// <param name="services"></param>
public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services)
{ {
//<EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ֧<EFBFBD><EFBFBD> //添加本地路径获取支持
services.AddSingleton(new AppSettingsHelper(Env.ContentRootPath)); services.AddSingleton(new AppSettingsHelper(Env.ContentRootPath));
services.AddSingleton(new LogLockHelper(Env.ContentRootPath)); services.AddSingleton(new LogLockHelper(Env.ContentRootPath));
//Memory<EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Memory缓存
services.AddMemoryCacheSetup(); services.AddMemoryCacheSetup();
//Redis<EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Redis缓存
services.AddRedisCacheSetup(); services.AddRedisCacheSetup();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SqlSugarע<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD> //添加数据库连接SqlSugar注入支持
services.AddSqlSugarSetup(); services.AddSqlSugarSetup();
//<EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CORS<EFBFBD><EFBFBD> //配置跨域(CORS
services.AddCorsSetup(); services.AddCorsSetup();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>session֧<EFBFBD><EFBFBD>(session<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cache<EFBFBD><EFBFBD><EFBFBD>д洢) //添加session支持(session依赖于cache进行存储)
services.AddSession(); services.AddSession();
// AutoMapper֧<EFBFBD><EFBFBD> // AutoMapper支持
services.AddAutoMapper(typeof(AutoMapperConfiguration)); services.AddAutoMapper(typeof(AutoMapperConfiguration));
//ʹ<EFBFBD><EFBFBD> SignalR //使用 SignalR
services.AddSignalR(); services.AddSignalR();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Payment <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><><D6A7><EFBFBD><EFBFBD>֧<EFBFBD><D6A7><><CEA2>֧<EFBFBD><D6A7>) // 引入Payment 依赖注入(支付宝支付/微信支付)
services.AddAlipay(); services.AddAlipay();
services.AddWeChatPay(); services.AddWeChatPay();
// <EFBFBD><EFBFBD> appsettings.json <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1> // appsettings.json 中 配置选项
//ע<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>潫ȡ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>Paylink<EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD>߽ӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //注册自定义的支付配置文件后面将取消使用Paylink直接走接口请求自定义处理。
services.Configure<WeChatPayOptions>(Configuration.GetSection("WeChatPay")); services.Configure<WeChatPayOptions>(Configuration.GetSection("WeChatPay"));
services.Configure<AlipayOptions>(Configuration.GetSection("Alipay")); services.Configure<AlipayOptions>(Configuration.GetSection("Alipay"));
//ע<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>΢<EFBFBD>Žӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD> //注册自定义微信接口配置文件
services.Configure<WeChat.Service.Options.WeChatOptions>(Configuration.GetSection(nameof(WeChat.Service.Options.WeChatOptions))); services.Configure<WeChat.Service.Options.WeChatOptions>(Configuration.GetSection(nameof(WeChat.Service.Options.WeChatOptions)));
// ע<EFBFBD><EFBFBD><EFBFBD> HTTP <EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD> // 注入工厂 HTTP 客户端
services.AddHttpClient(); services.AddHttpClient();
services.AddSingleton<WeChat.Service.HttpClients.IWeChatApiHttpClientFactory, WeChat.Service.HttpClients.WeChatApiHttpClientFactory>(); services.AddSingleton<WeChat.Service.HttpClients.IWeChatApiHttpClientFactory, WeChat.Service.HttpClients.WeChatApiHttpClientFactory>();
//<EFBFBD><EFBFBD><EFBFBD>ÿͻ<EFBFBD><EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //启用客户端IP限制速率
services.AddIpPolicyRateLimitSetup(Configuration); services.AddIpPolicyRateLimitSetup(Configuration);
//Swagger<EFBFBD>ӿ<EFBFBD><EFBFBD>ĵ<EFBFBD>ע<EFBFBD><EFBFBD> //Swagger接口文档注入
services.AddAdminSwaggerSetup(); services.AddAdminSwaggerSetup();
//jwt<EFBFBD><EFBFBD>Ȩ֧<EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD> //jwt授权支持注入
services.AddAuthorizationSetupForAdmin(); services.AddAuthorizationSetupForAdmin();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD> //上下文注入
services.AddHttpContextSetup(); services.AddHttpContextSetup();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD>AutoFac<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //服务配置中加入AutoFac控制器替换规则。
services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>()); services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
//ע<EFBFBD><EFBFBD>mvc<EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>razor<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ //注册mvc注册razor引擎视图
services.AddMvc(options => services.AddMvc(options =>
{ {
//ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤ //实体验证
options.Filters.Add<RequiredErrorForAdmin>(); options.Filters.Add<RequiredErrorForAdmin>();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //异常处理
options.Filters.Add<GlobalExceptionsFilterForAdmin>(); options.Filters.Add<GlobalExceptionsFilterForAdmin>();
//Swagger<EFBFBD>޳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>apiչʾ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD> //Swagger剔除不需要加入api展示的列表
options.Conventions.Add(new ApiExplorerIgnores()); options.Conventions.Add(new ApiExplorerIgnores());
options.EnableEndpointRouting = false; options.EnableEndpointRouting = false;
}) })
.AddNewtonsoftJson(p => .AddNewtonsoftJson(p =>
{ {
//<EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸСд <20><>ʹ<EFBFBD><CAB9><EFBFBD>շ<EFBFBD> //数据格式首字母小写 不使用驼峰
p.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); p.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
//<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>key //不使用驼峰样式的key
//p.SerializerSettings.ContractResolver = new DefaultContractResolver(); //p.SerializerSettings.ContractResolver = new DefaultContractResolver();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //忽略循环引用
p.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; p.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ //设置时间格式
p.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; p.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
}); });
// ѩ<EFBFBD><EFBFBD>Ư<EFBFBD><EFBFBD><EFBFBD> // 雪花漂移算法
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> IdGeneratorOptions <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WorkerId<EFBFBD><EFBFBD> // 创建 IdGeneratorOptions 对象,请在构造函数中输入 WorkerId
var options = new IdGeneratorOptions(1); var options = new IdGeneratorOptions(1);
// WorkerIdBitLength Ĭ<EFBFBD><EFBFBD>ֵ6<EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD> WorkerId <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪ2^6-1<EFBFBD><EFBFBD><EFBFBD><EFBFBD> WorkerId <EFBFBD><EFBFBD><EFBFBD><EFBFBD>64<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WorkerIdBitLength // WorkerIdBitLength 默认值6支持的 WorkerId 最大值为2^6-1,若 WorkerId 超过64可设置更大的 WorkerIdBitLength
// options.WorkerIdBitLength = 10; // options.WorkerIdBitLength = 10;
// ...... <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>òο<EFBFBD> IdGeneratorOptions <EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>ֻҪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WorkerIdBitLength <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WorkerId <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> // ...... 其它参数设置参考 IdGeneratorOptions 定义,一般来说,只要再设置 WorkerIdBitLength (决定 WorkerId 的最大值)。
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 保存参数(必须的操作,否则以上设置都不能生效):
YitIdHelper.SetIdGenerator(options); YitIdHelper.SetIdGenerator(options);
// <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>Ժ󣬼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<EFBFBD>ĵط<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 初始化以后即可在任何需要生成ID的地方调用以下方法
//var newId = YitIdHelper.NextId(); //var newId = YitIdHelper.NextId();
} }
/// <summary> /// <summary>
/// Autofac<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// Autofac规则配置
/// </summary> /// </summary>
/// <param name="builder"></param> /// <param name="builder"></param>
public void ConfigureContainer(ContainerBuilder builder) public void ConfigureContainer(ContainerBuilder builder)
{ {
builder.RegisterModule(new AutofacModuleRegister()); builder.RegisterModule(new AutofacModuleRegister());
//<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD> //获取所有控制器类型并使用属性注入
var controllerBaseType = typeof(ControllerBase); var controllerBaseType = typeof(ControllerBase);
builder.RegisterAssemblyTypes(typeof(Program).Assembly) builder.RegisterAssemblyTypes(typeof(Program).Assembly)
.Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType) .Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType)
@@ -174,20 +174,20 @@ namespace CoreCms.Net.Web.Admin
/// <param name="env"></param> /// <param name="env"></param>
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{ {
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ubuntu Nginx <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܻ<EFBFBD>ȡIP<EFBFBD><EFBFBD><EFBFBD><EFBFBD> #region Ubuntu Nginx IP问题
app.UseForwardedHeaders(new ForwardedHeadersOptions app.UseForwardedHeaders(new ForwardedHeadersOptions
{ {
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
}); });
#endregion #endregion
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ip<EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 开启Ip限流
app.UseIpLimitMiddle(); app.UseIpLimitMiddle();
// <EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E2BFAA>Ȩ<EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>д<EFBFBD><D0B4>) // 记录请求与返回数据 (注意开启权限,不然本地无法写入)
app.UseRequestResponseLog(); app.UseRequestResponseLog();
// <EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>¼(<28><><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><E3A3AC>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB3A3><EFBFBD><EFBFBD><E1B1A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD>)(ע<><EFBFBD><E2BFAA>Ȩ<EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>д<EFBFBD><D0B4>) // 用户访问记录(必须放到外层,不然如果遇到异常,会报错,因为不能返回流)(注意开启权限,不然本地无法写入)
app.UseRecordAccessLogsMildd(GlobalEnumVars.CoreShopSystemCategory.Admin.ToString()); app.UseRecordAccessLogsMildd(GlobalEnumVars.CoreShopSystemCategory.Admin.ToString());
// <EFBFBD><EFBFBD>¼ip<EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E2BFAA>Ȩ<EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>д<EFBFBD><D0B4>) // 记录ip请求 (注意开启权限,不然本地无法写入)
app.UseIpLogMildd(); app.UseIpLogMildd();
// signalr // signalr
app.UseSignalRSendMildd(); app.UseSignalRSendMildd();
@@ -195,7 +195,7 @@ namespace CoreCms.Net.Web.Admin
app.UseSwagger().UseSwaggerUI(c => app.UseSwagger().UseSwaggerUI(c =>
{ {
//<EFBFBD><EFBFBD><EFBFBD>ݰ汾<EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>չʾ //根据版本名称倒序 遍历展示
typeof(CustomApiVersion.ApiVersions).GetEnumNames().OrderByDescending(e => e).ToList().ForEach( typeof(CustomApiVersion.ApiVersions).GetEnumNames().OrderByDescending(e => e).ToList().ForEach(
version => version =>
{ {
@@ -204,12 +204,12 @@ namespace CoreCms.Net.Web.Admin
c.RoutePrefix = "doc"; c.RoutePrefix = "doc";
}); });
//ʹ<EFBFBD><EFBFBD> Session //使用 Session
app.UseSession(); app.UseSession();
if (env.IsDevelopment()) if (env.IsDevelopment())
{ {
// <EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>쳣ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 在开发环境中,使用异常页面,这样可以暴露错误堆栈信息,所以不要放在生产环境。
app.UseDeveloperExceptionPage(); app.UseDeveloperExceptionPage();
} }
else else
@@ -219,21 +219,21 @@ namespace CoreCms.Net.Web.Admin
app.UseHsts(); app.UseHsts();
} }
// CORS<EFBFBD><EFBFBD><EFBFBD><EFBFBD> // CORS跨域
app.UseCors(AppSettingsConstVars.CorsPolicyName); app.UseCors(AppSettingsConstVars.CorsPolicyName);
// <EFBFBD><EFBFBD>תhttps // 跳转https
//app.UseHttpsRedirection(); //app.UseHttpsRedirection();
// ʹ<EFBFBD>þ<EFBFBD>̬<EFBFBD>ļ<EFBFBD> // 使用静态文件
app.UseStaticFiles(); app.UseStaticFiles();
// ʹ<EFBFBD><EFBFBD>cookie // 使用cookie
app.UseCookiePolicy(); app.UseCookiePolicy();
// <EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 返回错误码
app.UseStatusCodePages(); app.UseStatusCodePages();
// Routing // Routing
app.UseRouting(); app.UseRouting();
// <EFBFBD>ȿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤ // 先开启认证
app.UseAuthentication(); app.UseAuthentication();
// Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD>м<EFBFBD><EFBFBD><EFBFBD> // 然后是授权中间件
app.UseAuthorization(); app.UseAuthorization();
app.UseEndpoints(endpoints => app.UseEndpoints(endpoints =>
{ {
@@ -247,8 +247,8 @@ namespace CoreCms.Net.Web.Admin
"{controller=Home}/{action=Index}/{id?}"); "{controller=Home}/{action=Index}/{id?}");
}); });
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>default.html<EFBFBD><EFBFBD> //设置默认起始页(如default.html
//<EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>wwwroot<EFBFBD>ļ<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD> //此处的路径是相对于wwwroot文件夹的相对路径
var defaultFilesOptions = new DefaultFilesOptions(); var defaultFilesOptions = new DefaultFilesOptions();
defaultFilesOptions.DefaultFileNames.Clear(); defaultFilesOptions.DefaultFileNames.Clear();
defaultFilesOptions.DefaultFileNames.Add("index.html"); defaultFilesOptions.DefaultFileNames.Add("index.html");

View File

@@ -1,4 +1,4 @@
using System; using System;
using Autofac.Extensions.DependencyInjection; using Autofac.Extensions.DependencyInjection;
using CoreCms.Net.Loging; using CoreCms.Net.Loging;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
@@ -12,12 +12,12 @@ using LogLevel = NLog.LogLevel;
namespace CoreCms.Net.Web.WebApi namespace CoreCms.Net.Web.WebApi
{ {
/// <summary> /// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// 启动类
/// </summary> /// </summary>
public class Program public class Program
{ {
/// <summary> /// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// 启动配置
/// </summary> /// </summary>
/// <param name="args"></param> /// <param name="args"></param>
public static void Main(string[] args) public static void Main(string[] args)
@@ -25,23 +25,23 @@ namespace CoreCms.Net.Web.WebApi
var host = CreateHostBuilder(args).Build(); var host = CreateHostBuilder(args).Build();
try try
{ {
//ȷ<EFBFBD><EFBFBD>NLog.config<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>appsettings.json<EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD> //确保NLog.config中连接字符串与appsettings.json中同步
NLogUtil.EnsureNlogConfig("NLog.config"); NLogUtil.EnsureNlogConfig("NLog.config");
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //其他项目启动时需要做的事情
NLogUtil.WriteAll(LogLevel.Trace, LogType.Web, "<EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>"); NLogUtil.WriteAll(LogLevel.Trace, LogType.Web, "接口启动", "接口启动成功");
host.Run(); host.Run();
} }
catch (Exception ex) catch (Exception ex)
{ {
//ʹ<EFBFBD><EFBFBD>nlogд<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD>ӳɹ<D3B3><C9B9><EFBFBD> //使用nlog写到本地日志文件(万一数据库没创建/连接成功)
NLogUtil.WriteFileLog(LogLevel.Error, LogType.ApiRequest, "<EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", ex); NLogUtil.WriteFileLog(LogLevel.Error, LogType.ApiRequest, "接口启动", "初始化数据异常", ex);
throw; throw;
} }
} }
/// <summary> /// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD> /// 创建启动支撑
/// </summary> /// </summary>
/// <param name="args"></param> /// <param name="args"></param>
/// <returns></returns> /// <returns></returns>
@@ -51,8 +51,8 @@ namespace CoreCms.Net.Web.WebApi
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) //<--NOTE THIS .UseServiceProviderFactory(new AutofacServiceProviderFactory()) //<--NOTE THIS
.ConfigureLogging(logging => .ConfigureLogging(logging =>
{ {
logging.ClearProviders(); //<EFBFBD>Ƴ<EFBFBD><EFBFBD>Ѿ<EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> logging.ClearProviders(); //移除已经注册的其他日志处理程序
logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD> logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); //设置最小的日志级别
}) })
.UseNLog() //NLog: Setup NLog for Dependency injection .UseNLog() //NLog: Setup NLog for Dependency injection
.ConfigureWebHostDefaults(webBuilder => .ConfigureWebHostDefaults(webBuilder =>
@@ -60,7 +60,7 @@ namespace CoreCms.Net.Web.WebApi
webBuilder webBuilder
.ConfigureKestrel(serverOptions => .ConfigureKestrel(serverOptions =>
{ {
serverOptions.AllowSynchronousIO = true; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><EFBFBD> IO serverOptions.AllowSynchronousIO = true; //启用同步 IO
}) })
.UseStartup<Startup>(); .UseStartup<Startup>();
}); });

View File

@@ -1,4 +1,4 @@
using Autofac; using Autofac;
using CoreCms.Net.Auth; using CoreCms.Net.Auth;
using CoreCms.Net.Configuration; using CoreCms.Net.Configuration;
using CoreCms.Net.Core.AutoFac; using CoreCms.Net.Core.AutoFac;
@@ -34,12 +34,12 @@ using Yitter.IdGenerator;
namespace CoreCms.Net.Web.WebApi namespace CoreCms.Net.Web.WebApi
{ {
/// <summary> /// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// 启动配置
/// </summary> /// </summary>
public class Startup public class Startup
{ {
/// <summary> /// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// 构造函数
/// </summary> /// </summary>
/// <param name="configuration"></param> /// <param name="configuration"></param>
/// <param name="env"></param> /// <param name="env"></param>
@@ -49,125 +49,125 @@ namespace CoreCms.Net.Web.WebApi
Env = env; Env = env;
} }
/// <summary> /// <summary>
/// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// 配置属性
/// </summary> /// </summary>
public IConfiguration Configuration { get; } public IConfiguration Configuration { get; }
/// <summary> /// <summary>
/// web<EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// web环境
/// </summary> /// </summary>
public IWebHostEnvironment Env { get; } public IWebHostEnvironment Env { get; }
/// This method gets called by the runtime. Use this method to add services to the container. /// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services) public void ConfigureServices(IServiceCollection services)
{ {
//<EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ֧<EFBFBD><EFBFBD> //添加本地路径获取支持
services.AddSingleton(new AppSettingsHelper(Env.ContentRootPath)); services.AddSingleton(new AppSettingsHelper(Env.ContentRootPath));
services.AddSingleton(new LogLockHelper(Env.ContentRootPath)); services.AddSingleton(new LogLockHelper(Env.ContentRootPath));
//Memory<EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Memory缓存
services.AddMemoryCacheSetup(); services.AddMemoryCacheSetup();
//Redis<EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Redis缓存
services.AddRedisCacheSetup(); services.AddRedisCacheSetup();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SqlSugarע<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD> //添加数据库连接SqlSugar注入支持
services.AddSqlSugarSetup(); services.AddSqlSugarSetup();
//<EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CORS<EFBFBD><EFBFBD> //配置跨域(CORS
services.AddCorsSetup(); services.AddCorsSetup();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>session֧<EFBFBD><EFBFBD>(session<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cache<EFBFBD><EFBFBD><EFBFBD>д洢) //添加session支持(session依赖于cache进行存储)
services.AddSession(); services.AddSession();
// AutoMapper֧<EFBFBD><EFBFBD> // AutoMapper支持
services.AddAutoMapper(typeof(AutoMapperConfiguration)); services.AddAutoMapper(typeof(AutoMapperConfiguration));
//MediatR<EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD>Ҫע<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><><CDAC>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¾Ͳ<C2BE><CDB2><EFBFBD>Ҫע<D2AA><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //MediatR(只需要注册一个,同项目或类库下就不需要注册多个)
services.AddMediatR(typeof(TextMessageEventCommand).Assembly); services.AddMediatR(typeof(TextMessageEventCommand).Assembly);
//ʹ<EFBFBD><EFBFBD> SignalR //使用 SignalR
services.AddSignalR(); services.AddSignalR();
//Redis<EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> //Redis消息队列
services.AddRedisMessageQueueSetup(); services.AddRedisMessageQueueSetup();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Payment <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD><><D6A7><EFBFBD><EFBFBD>֧<EFBFBD><D6A7><><CEA2>֧<EFBFBD><D6A7>) // 引入Payment 依赖注入(支付宝支付/微信支付)
services.AddAlipay(); services.AddAlipay();
services.AddWeChatPay(); services.AddWeChatPay();
// <EFBFBD><EFBFBD> appsettings.json <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1> // appsettings.json 中 配置选项
services.Configure<WeChatPayOptions>(Configuration.GetSection("WeChatPay")); services.Configure<WeChatPayOptions>(Configuration.GetSection("WeChatPay"));
services.Configure<AlipayOptions>(Configuration.GetSection("Alipay")); services.Configure<AlipayOptions>(Configuration.GetSection("Alipay"));
//ע<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD>΢<EFBFBD>Žӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD> //注册自定义微信接口配置文件
services.Configure<WeChat.Service.Options.WeChatOptions>(Configuration.GetSection(nameof(WeChat.Service.Options.WeChatOptions))); services.Configure<WeChat.Service.Options.WeChatOptions>(Configuration.GetSection(nameof(WeChat.Service.Options.WeChatOptions)));
// ע<EFBFBD><EFBFBD><EFBFBD> HTTP <EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD> // 注入工厂 HTTP 客户端
services.AddHttpClient(); services.AddHttpClient();
services.AddSingleton<WeChat.Service.HttpClients.IWeChatApiHttpClientFactory, WeChat.Service.HttpClients.WeChatApiHttpClientFactory>(); services.AddSingleton<WeChat.Service.HttpClients.IWeChatApiHttpClientFactory, WeChat.Service.HttpClients.WeChatApiHttpClientFactory>();
//<EFBFBD><EFBFBD><EFBFBD>ÿͻ<EFBFBD><EFBFBD><EFBFBD>IP<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //启用客户端IP限制速率
services.AddIpPolicyRateLimitSetup(Configuration); services.AddIpPolicyRateLimitSetup(Configuration);
//Swagger<EFBFBD>ӿ<EFBFBD><EFBFBD>ĵ<EFBFBD>ע<EFBFBD><EFBFBD> //Swagger接口文档注入
services.AddClientSwaggerSetup(); services.AddClientSwaggerSetup();
//ע<EFBFBD><EFBFBD>Hangfire<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> //注册Hangfire定时任务
services.AddHangFireSetup(); services.AddHangFireSetup();
//<EFBFBD><EFBFBD>Ȩ֧<EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD> //授权支持注入
services.AddAuthorizationSetupForClient(); services.AddAuthorizationSetupForClient();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD> //上下文注入
services.AddHttpContextSetup(); services.AddHttpContextSetup();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><EFBFBD><EFBFBD>AutoFac<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //服务配置中加入AutoFac控制器替换规则。
services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>()); services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
//ע<EFBFBD><EFBFBD>mvc<EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD>razor<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ //注册mvc注册razor引擎视图
services.AddMvc(options => services.AddMvc(options =>
{ {
//ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤ //实体验证
options.Filters.Add<RequiredErrorForClent>(); options.Filters.Add<RequiredErrorForClent>();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //异常处理
options.Filters.Add<GlobalExceptionsFilterForClent>(); options.Filters.Add<GlobalExceptionsFilterForClent>();
//Swagger<EFBFBD>޳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>apiչʾ<EFBFBD><EFBFBD><EFBFBD>б<EFBFBD> //Swagger剔除不需要加入api展示的列表
options.Conventions.Add(new ApiExplorerIgnores()); options.Conventions.Add(new ApiExplorerIgnores());
}) })
.AddNewtonsoftJson(p => .AddNewtonsoftJson(p =>
{ {
//<EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸСд <20><>ʹ<EFBFBD>ô<EFBFBD><C3B4>շ<EFBFBD> //数据格式首字母小写 不使用大驼峰
p.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); p.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
//<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>key //不使用驼峰样式的key
//p.SerializerSettings.ContractResolver = new DefaultContractResolver(); //p.SerializerSettings.ContractResolver = new DefaultContractResolver();
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //忽略循环引用
p.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; p.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>yyyy/MM/dd<64><64>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>Ϊiosϵͳ<CFB5><CDB3>֧<EFBFBD><D6A7>2018-03-29<32><39>ʽ<EFBFBD><CABD>ʱ<EFBFBD>䣬ֻʶ<D6BB><CAB6>2018/03/09<30><39><EFBFBD>ָ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD> //设置时间格式必须使用yyyy/MM/dd格式因为ios系统不支持2018-03-29格式的时间只识别2018/03/09这种格式。
p.SerializerSettings.DateFormatString = "yyyy/MM/dd HH:mm:ss"; p.SerializerSettings.DateFormatString = "yyyy/MM/dd HH:mm:ss";
}); });
// ѩ<EFBFBD><EFBFBD>Ư<EFBFBD><EFBFBD><EFBFBD> // 雪花漂移算法
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> IdGeneratorOptions <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WorkerId<EFBFBD><EFBFBD> // 创建 IdGeneratorOptions 对象,请在构造函数中输入 WorkerId
var options = new IdGeneratorOptions(1); var options = new IdGeneratorOptions(1);
// WorkerIdBitLength Ĭ<EFBFBD><EFBFBD>ֵ6<EFBFBD><EFBFBD>֧<EFBFBD>ֵ<EFBFBD> WorkerId <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪ2^6-1<EFBFBD><EFBFBD><EFBFBD><EFBFBD> WorkerId <EFBFBD><EFBFBD><EFBFBD><EFBFBD>64<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WorkerIdBitLength // WorkerIdBitLength 默认值6支持的 WorkerId 最大值为2^6-1,若 WorkerId 超过64可设置更大的 WorkerIdBitLength
// options.WorkerIdBitLength = 10; // options.WorkerIdBitLength = 10;
// ...... <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>òο<EFBFBD> IdGeneratorOptions <EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>ֻҪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WorkerIdBitLength <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> WorkerId <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> // ...... 其它参数设置参考 IdGeneratorOptions 定义,一般来说,只要再设置 WorkerIdBitLength (决定 WorkerId 的最大值)。
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 保存参数(必须的操作,否则以上设置都不能生效):
YitIdHelper.SetIdGenerator(options); YitIdHelper.SetIdGenerator(options);
// <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>Ժ󣬼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<EFBFBD>ĵط<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 初始化以后即可在任何需要生成ID的地方调用以下方法
//var newId = YitIdHelper.NextId(); //var newId = YitIdHelper.NextId();
} }
/// <summary> /// <summary>
/// Autofac<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /// Autofac规则配置
/// </summary> /// </summary>
/// <param name="builder"></param> /// <param name="builder"></param>
public void ConfigureContainer(ContainerBuilder builder) public void ConfigureContainer(ContainerBuilder builder)
{ {
//<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><EFBFBD> //获取所有控制器类型并使用属性注入
var controllerBaseType = typeof(ControllerBase); var controllerBaseType = typeof(ControllerBase);
builder.RegisterAssemblyTypes(typeof(Program).Assembly) builder.RegisterAssemblyTypes(typeof(Program).Assembly)
.Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType) .Where(t => controllerBaseType.IsAssignableFrom(t) && t != controllerBaseType)
@@ -185,43 +185,43 @@ namespace CoreCms.Net.Web.WebApi
/// <param name="env"></param> /// <param name="env"></param>
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{ {
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ubuntu Nginx <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܻ<EFBFBD>ȡIP<EFBFBD><EFBFBD><EFBFBD><EFBFBD> #region Ubuntu Nginx IP问题
app.UseForwardedHeaders(new ForwardedHeadersOptions app.UseForwardedHeaders(new ForwardedHeadersOptions
{ {
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
}); });
#endregion #endregion
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ip<EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 开启Ip限流
app.UseIpLimitMiddle(); app.UseIpLimitMiddle();
// <EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E2BFAA>Ȩ<EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>д<EFBFBD><D0B4>) // 记录请求与返回数据 (注意开启权限,不然本地无法写入)
app.UseRequestResponseLog(); app.UseRequestResponseLog();
// <EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>¼(<28><><EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><E3A3AC>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB3A3><EFBFBD><EFBFBD><E1B1A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD>)(ע<><EFBFBD><E2BFAA>Ȩ<EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>д<EFBFBD><D0B4>) // 用户访问记录(必须放到外层,不然如果遇到异常,会报错,因为不能返回流)(注意开启权限,不然本地无法写入)
app.UseRecordAccessLogsMildd(GlobalEnumVars.CoreShopSystemCategory.Api.ToString()); app.UseRecordAccessLogsMildd(GlobalEnumVars.CoreShopSystemCategory.Api.ToString());
// <EFBFBD><EFBFBD>¼ip<EFBFBD><EFBFBD><EFBFBD><EFBFBD><><EFBFBD><E2BFAA>Ȩ<EFBFBD>ޣ<EFBFBD><DEA3><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD>д<EFBFBD><D0B4>) // 记录ip请求 (注意开启权限,不然本地无法写入)
app.UseIpLogMildd(); app.UseIpLogMildd();
//ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> //强制显示中文
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN"); System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
app.UseSwagger().UseSwaggerUI(c => app.UseSwagger().UseSwaggerUI(c =>
{ {
//<EFBFBD><EFBFBD><EFBFBD>ݰ汾<EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>չʾ //根据版本名称倒序 遍历展示
typeof(CustomApiVersion.ApiVersions).GetEnumNames().OrderByDescending(e => e).ToList().ForEach( typeof(CustomApiVersion.ApiVersions).GetEnumNames().OrderByDescending(e => e).ToList().ForEach(
version => version =>
{ {
c.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"Doc {version}"); c.SwaggerEndpoint($"/swagger/{version}/swagger.json", $"Doc {version}");
}); });
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>swagger-ui //设置默认跳转到swagger-ui
c.RoutePrefix = "doc"; c.RoutePrefix = "doc";
//c.RoutePrefix = string.Empty; //c.RoutePrefix = string.Empty;
}); });
#region Hangfire<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> #region Hangfire定时任务
//<EFBFBD><EFBFBD>Ȩ //授权
var filter = new BasicAuthAuthorizationFilter( var filter = new BasicAuthAuthorizationFilter(
new BasicAuthAuthorizationFilterOptions new BasicAuthAuthorizationFilterOptions
{ {
@@ -242,8 +242,8 @@ namespace CoreCms.Net.Web.WebApi
}); });
var options = new DashboardOptions var options = new DashboardOptions
{ {
AppPath = "/",//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ת<EFBFBD>ĵ<EFBFBD>ַ AppPath = "/",//返回时跳转的地址
DisplayStorageConnectionString = false,//<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ DisplayStorageConnectionString = false,//是否显示数据库连接信息
Authorization = new[] Authorization = new[]
{ {
filter filter
@@ -251,17 +251,17 @@ namespace CoreCms.Net.Web.WebApi
IsReadOnlyFunc = _ => false IsReadOnlyFunc = _ => false
}; };
app.UseHangfireDashboard("/job", options); //<EFBFBD><EFBFBD><EFBFBD>Ըı<EFBFBD>Dashboard<EFBFBD><EFBFBD>url app.UseHangfireDashboard("/job", options); //可以改变Dashboardurl
HangfireDispose.HangfireService(); HangfireDispose.HangfireService();
#endregion #endregion
//ʹ<EFBFBD><EFBFBD> Session //使用 Session
app.UseSession(); app.UseSession();
if (env.IsDevelopment()) if (env.IsDevelopment())
{ {
// <EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>쳣ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 在开发环境中,使用异常页面,这样可以暴露错误堆栈信息,所以不要放在生产环境。
app.UseDeveloperExceptionPage(); app.UseDeveloperExceptionPage();
} }
else else
@@ -271,17 +271,17 @@ namespace CoreCms.Net.Web.WebApi
app.UseHsts(); app.UseHsts();
} }
// CORS<EFBFBD><EFBFBD><EFBFBD><EFBFBD> // CORS跨域
app.UseCors(AppSettingsConstVars.CorsPolicyName); app.UseCors(AppSettingsConstVars.CorsPolicyName);
// Routing // Routing
app.UseRouting(); app.UseRouting();
// ʹ<EFBFBD>þ<EFBFBD>̬<EFBFBD>ļ<EFBFBD> // 使用静态文件
app.UseStaticFiles(); app.UseStaticFiles();
// <EFBFBD>ȿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤ // 先开启认证
app.UseAuthentication(); app.UseAuthentication();
// Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD>м<EFBFBD><EFBFBD><EFBFBD> // 然后是授权中间件
app.UseAuthorization(); app.UseAuthorization();
app.UseEndpoints(endpoints => app.UseEndpoints(endpoints =>
@@ -299,8 +299,8 @@ namespace CoreCms.Net.Web.WebApi
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>default.html<EFBFBD><EFBFBD> //设置默认起始页(如default.html
//<EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>wwwroot<EFBFBD>ļ<EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD> //此处的路径是相对于wwwroot文件夹的相对路径
var defaultFilesOptions = new DefaultFilesOptions(); var defaultFilesOptions = new DefaultFilesOptions();
defaultFilesOptions.DefaultFileNames.Clear(); defaultFilesOptions.DefaultFileNames.Clear();
defaultFilesOptions.DefaultFileNames.Add("index.html"); defaultFilesOptions.DefaultFileNames.Add("index.html");