From bd1b811fb5804485eef66c344a1fbe700ab3eaea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=86=9B?= <510423039@qq.com> Date: Thu, 1 Dec 2022 21:02:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84Shared.Host.Microserv?= =?UTF-8?q?ice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Lion.AbpPro.WebGateway/GlobalUsings.cs | 1 - .../BasicManagementHttpApiHostModule.cs | 3 +- .../AbpProHttpApiHostModule.cs | 25 +++- ....cs => AutoDeleteAfterSuccessAttribute.cs} | 4 +- .../Hangfire/RecurringJobsExtensions.cs | 2 +- ...oApplicationBuilderExtensionsExtensions.cs | 13 -- .../Lion.AbpPro.HttpApi.Host/GlobalUsings.cs | 5 +- .../Lion.AbpPro.HttpApi.Host/appsettings.json | 5 +- ...Lion.AbpPro.Shared.Hosting.Gateways.csproj | 1 + .../AbpPro}/SharedHostingGatewayModule.cs | 2 +- .../GlobalUsings.cs | 6 +- ...AbpPro.Shared.Hosting.Microservices.csproj | 32 ++++- .../AbpPro/SharedHostingMicroserviceModule.cs | 122 ++++++++++++++++ .../Builder/ApplicationBuilderExtensions.cs | 24 +++- .../Mvc/Filters/LionExceptionFilter.cs | 2 +- .../Mvc/Filters/LionResultFilter.cs | 2 +- .../RequestLog}/RequestLogMiddleware.cs | 2 +- .../ServiceCollectionExtensions.cs | 2 +- .../Serilog}/SerilogToEsExtensions.cs | 5 +- .../SharedHostingMicroserviceModule.cs | 130 ------------------ .../Swagger/EnumSchemaFilter.cs | 21 +++ .../HiddenAbpDefaultApiFilter.cs | 2 +- .../Swaggers/EnumSchemaFilter.cs | 22 --- .../DefaultHttpExceptionStatusCodeFinder.cs | 2 +- 24 files changed, 230 insertions(+), 205 deletions(-) rename aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Hangfire/{AutoDeleteAfterSuccessAttributer.cs => AutoDeleteAfterSuccessAttribute.cs} (73%) delete mode 100644 aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Middlewares/AbpProApplicationBuilderExtensionsExtensions.cs rename aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Gateways/{ => Lion/AbpPro}/SharedHostingGatewayModule.cs (95%) create mode 100644 aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Lion/AbpPro/SharedHostingMicroserviceModule.cs rename aspnet-core/{services/host/Lion.AbpPro.HttpApi.Host/Extensions/Middlewares => shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/RequestLog}/RequestLogMiddleware.cs (98%) rename aspnet-core/{services/host/Lion.AbpPro.HttpApi.Host/Extensions => shared/Lion.AbpPro.Shared.Hosting.Microservices/Serilog}/SerilogToEsExtensions.cs (97%) delete mode 100644 aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/SharedHostingMicroserviceModule.cs create mode 100644 aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swagger/EnumSchemaFilter.cs rename aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/{Swaggers => Swagger}/HiddenAbpDefaultApiFilter.cs (96%) delete mode 100644 aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swaggers/EnumSchemaFilter.cs diff --git a/aspnet-core/gateways/Lion.AbpPro.WebGateway/GlobalUsings.cs b/aspnet-core/gateways/Lion.AbpPro.WebGateway/GlobalUsings.cs index 42a28406..9e315822 100644 --- a/aspnet-core/gateways/Lion.AbpPro.WebGateway/GlobalUsings.cs +++ b/aspnet-core/gateways/Lion.AbpPro.WebGateway/GlobalUsings.cs @@ -4,7 +4,6 @@ global using System; global using System.Collections.Generic; global using System.Linq; global using System.Threading.Tasks; -global using Lion.AbpPro.Shared.Hosting.Gateways; global using Microsoft.AspNetCore.Builder; global using Microsoft.AspNetCore.Cors; global using Microsoft.AspNetCore.Hosting; diff --git a/aspnet-core/modules/BasicManagement/host/Lion.AbpPro.BasicManagement.HttpApi.Host/BasicManagementHttpApiHostModule.cs b/aspnet-core/modules/BasicManagement/host/Lion.AbpPro.BasicManagement.HttpApi.Host/BasicManagementHttpApiHostModule.cs index 64235651..5f5ca1cd 100644 --- a/aspnet-core/modules/BasicManagement/host/Lion.AbpPro.BasicManagement.HttpApi.Host/BasicManagementHttpApiHostModule.cs +++ b/aspnet-core/modules/BasicManagement/host/Lion.AbpPro.BasicManagement.HttpApi.Host/BasicManagementHttpApiHostModule.cs @@ -2,12 +2,11 @@ using System.Text; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.DataProtection; using Lion.AbpPro.BasicManagement.EntityFrameworkCore; -using Lion.AbpPro.Shared.Hosting.Microservices; -using Lion.AbpPro.Shared.Hosting.Microservices.Swaggers; using Microsoft.AspNetCore.Mvc; using Microsoft.IdentityModel.Tokens; using StackExchange.Redis; using Microsoft.OpenApi.Models; +using Swagger; using Swashbuckle.AspNetCore.SwaggerUI; using Volo.Abp; using Volo.Abp.AspNetCore.ExceptionHandling; diff --git a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/AbpProHttpApiHostModule.cs b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/AbpProHttpApiHostModule.cs index 33526c96..b827e4a2 100644 --- a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/AbpProHttpApiHostModule.cs +++ b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/AbpProHttpApiHostModule.cs @@ -1,3 +1,4 @@ +using Swagger; using Volo.Abp.BackgroundJobs.Hangfire; namespace Lion.AbpPro @@ -18,8 +19,7 @@ namespace Lion.AbpPro )] public class AbpProHttpApiHostModule : AbpModule { - public override void OnPostApplicationInitialization( - ApplicationInitializationContext context) + public override void OnPostApplicationInitialization(ApplicationInitializationContext context) { // 应用程序初始化的时候注册hangfire context.CreateRecurringJob(); @@ -43,11 +43,14 @@ namespace Lion.AbpPro { var app = context.GetApplicationBuilder(); var configuration = context.GetConfiguration(); - //app.UseRequestLog(); app.UseAbpRequestLocalization(); app.UseCorrelationId(); app.UseStaticFiles(); - app.UseMiniProfiler(); + if (configuration.GetValue("MiniProfiler:Enabled", false)) + { + app.UseMiniProfiler(); + } + app.UseRouting(); app.UseCors(AbpProHttpApiHostConst.DefaultCorsPolicyName); app.UseAuthentication(); @@ -84,6 +87,8 @@ namespace Lion.AbpPro } + #region 私有配置 + private void ConfigureHangfire(ServiceConfigurationContext context) { Configure(options => { options.IsJobExecutionEnabled = true; }); @@ -94,7 +99,7 @@ namespace Lion.AbpPro var delaysInSeconds = new[] { 10, 60, 60 * 3 }; // 重试时间间隔 const int Attempts = 3; // 重试次数 config.UseFilter(new AutomaticRetryAttribute() { Attempts = Attempts, DelaysInSeconds = delaysInSeconds }); - config.UseFilter(new AutoDeleteAfterSuccessAttributer(TimeSpan.FromDays(7))); + config.UseFilter(new AutoDeleteAfterSuccessAttribute(TimeSpan.FromDays(7))); config.UseFilter(new JobRetryLastFilter(Attempts)); }); } @@ -104,7 +109,11 @@ namespace Lion.AbpPro /// private void ConfigureMiniProfiler(ServiceConfigurationContext context) { - context.Services.AddMiniProfiler(options => options.RouteBasePath = "/profiler").AddEntityFramework(); + if (context.Services.GetConfiguration().GetValue("MiniProfiler:Enabled", false)) + { + context.Services.AddMiniProfiler(options => options.RouteBasePath = "/profiler").AddEntityFramework(); + } + } /// @@ -199,7 +208,7 @@ namespace Lion.AbpPro context.Services.Configure(options => { options.Lockout = new LockoutOptions() { AllowedForNewUsers = false }; }); } - private static void ConfigureSwaggerServices(ServiceConfigurationContext context) + private void ConfigureSwaggerServices(ServiceConfigurationContext context) { context.Services.AddSwaggerGen( options => @@ -324,5 +333,7 @@ namespace Lion.AbpPro options.IgnoredUrls.Add("/cap"); }); } + + #endregion } } \ No newline at end of file diff --git a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Hangfire/AutoDeleteAfterSuccessAttributer.cs b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Hangfire/AutoDeleteAfterSuccessAttribute.cs similarity index 73% rename from aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Hangfire/AutoDeleteAfterSuccessAttributer.cs rename to aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Hangfire/AutoDeleteAfterSuccessAttribute.cs index 0f94e551..4e67436d 100644 --- a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Hangfire/AutoDeleteAfterSuccessAttributer.cs +++ b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Hangfire/AutoDeleteAfterSuccessAttribute.cs @@ -1,10 +1,10 @@ namespace Lion.AbpPro.Extensions.Hangfire; -public class AutoDeleteAfterSuccessAttributer : JobFilterAttribute, IApplyStateFilter +public class AutoDeleteAfterSuccessAttribute : JobFilterAttribute, IApplyStateFilter { private readonly TimeSpan _deleteAfter; - public AutoDeleteAfterSuccessAttributer(TimeSpan timeSpan) + public AutoDeleteAfterSuccessAttribute(TimeSpan timeSpan) { _deleteAfter = timeSpan; } diff --git a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Hangfire/RecurringJobsExtensions.cs b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Hangfire/RecurringJobsExtensions.cs index 8b9f4c65..2be71511 100644 --- a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Hangfire/RecurringJobsExtensions.cs +++ b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Hangfire/RecurringJobsExtensions.cs @@ -1,6 +1,6 @@ using Lion.AbpPro.Jobs; -namespace Lion.AbpPro.Extensions +namespace Lion.AbpPro.Extensions.Hangfire { public static class RecurringJobsExtensions { diff --git a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Middlewares/AbpProApplicationBuilderExtensionsExtensions.cs b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Middlewares/AbpProApplicationBuilderExtensionsExtensions.cs deleted file mode 100644 index e840b238..00000000 --- a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Middlewares/AbpProApplicationBuilderExtensionsExtensions.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Microsoft.AspNetCore.Builder; - -public static class AbpProApplicationBuilderExtensionsExtensions -{ - /// - /// 记录请求响应日志 - /// - /// - public static IApplicationBuilder UseRequestLog(this IApplicationBuilder app) - { - return app.UseMiddleware(); - } -} \ No newline at end of file diff --git a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/GlobalUsings.cs b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/GlobalUsings.cs index 09dd4f0e..88738174 100644 --- a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/GlobalUsings.cs +++ b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/GlobalUsings.cs @@ -17,11 +17,7 @@ global using Lion.AbpPro.EntityFrameworkCore; global using Lion.AbpPro.Core; global using Lion.AbpPro.Extensions; global using Lion.AbpPro.Extensions.Hangfire; -global using Lion.AbpPro.Extensions.Middlewares; global using Lion.AbpPro.MultiTenancy; -global using Lion.AbpPro.Shared.Hosting.Microservices; -global using Lion.AbpPro.Shared.Hosting.Microservices.Microsoft.AspNetCore.Builder; -global using Lion.AbpPro.Shared.Hosting.Microservices.Swaggers; global using Magicodes.ExporterAndImporter.Core; global using Magicodes.ExporterAndImporter.Excel; global using Microsoft.AspNetCore.Authentication.JwtBearer; @@ -58,6 +54,7 @@ global using Volo.Abp.AspNetCore.Serilog; global using Volo.Abp.Auditing; global using Volo.Abp.Authorization; global using Volo.Abp.BackgroundJobs; +global using Volo.Abp.BackgroundJobs.Hangfire; global using Volo.Abp.Caching; global using Volo.Abp.Caching.StackExchangeRedis; global using Volo.Abp.DependencyInjection; diff --git a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json index 87d1f3f5..2ae90032 100644 --- a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json +++ b/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/appsettings.json @@ -35,7 +35,7 @@ }, "ConnectionStrings": { "Default": "Data Source=localhost;Port=3306;Database=LionAbpProDB;uid=root;pwd=1q2w3E*;charset=utf8mb4;Allow User Variables=true;AllowLoadLocalInfile=true", - "Hangfire": "localhost:6379,defaultdatabase=1" + "Hangfire": "localhost:6379,defaultdatabase=5" }, "Redis": { "Configuration": "localhost,password=1q2w3E*,defaultdatabase=1" @@ -66,5 +66,8 @@ "Enabled": false, "Host": "http://localhost:8500", "Service": "LionAbpPro-Service" + }, + "MiniProfiler": { + "Enabled": true } } \ No newline at end of file diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Gateways/Lion.AbpPro.Shared.Hosting.Gateways.csproj b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Gateways/Lion.AbpPro.Shared.Hosting.Gateways.csproj index e47e88f3..b0327095 100644 --- a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Gateways/Lion.AbpPro.Shared.Hosting.Gateways.csproj +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Gateways/Lion.AbpPro.Shared.Hosting.Gateways.csproj @@ -2,6 +2,7 @@ net6.0 + diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Gateways/SharedHostingGatewayModule.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Gateways/Lion/AbpPro/SharedHostingGatewayModule.cs similarity index 95% rename from aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Gateways/SharedHostingGatewayModule.cs rename to aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Gateways/Lion/AbpPro/SharedHostingGatewayModule.cs index ce5e1cf5..287c7c00 100644 --- a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Gateways/SharedHostingGatewayModule.cs +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Gateways/Lion/AbpPro/SharedHostingGatewayModule.cs @@ -1,4 +1,4 @@ -namespace Lion.AbpPro.Shared.Hosting.Gateways +namespace Lion.AbpPro { [DependsOn( typeof(AbpSwashbuckleModule), diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/GlobalUsings.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/GlobalUsings.cs index 089ec437..3e8269c5 100644 --- a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/GlobalUsings.cs +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/GlobalUsings.cs @@ -5,9 +5,10 @@ global using System.Collections.Generic; global using System.Linq; global using System.Net; global using System.Reflection; +global using System.Text; +global using System.Text.RegularExpressions; global using Consul; global using Lion.AbpPro.Core; -global using Lion.AbpPro.Shared.Hosting.Microservices.Microsoft.Extensions.DependencyInjection; global using Microsoft.AspNetCore.Builder; global using Microsoft.AspNetCore.Cors; global using Microsoft.AspNetCore.Http; @@ -24,6 +25,9 @@ global using Microsoft.Extensions.Options; global using Microsoft.OpenApi.Any; global using Microsoft.OpenApi.Models; global using Newtonsoft.Json; +global using Serilog; +global using Serilog.Exceptions; +global using Serilog.Sinks.Elasticsearch; global using Swashbuckle.AspNetCore.SwaggerGen; global using Volo.Abp; global using Volo.Abp.AspNetCore.ExceptionHandling; diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Lion.AbpPro.Shared.Hosting.Microservices.csproj b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Lion.AbpPro.Shared.Hosting.Microservices.csproj index 5367cc1f..123a4ce9 100644 --- a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Lion.AbpPro.Shared.Hosting.Microservices.csproj +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Lion.AbpPro.Shared.Hosting.Microservices.csproj @@ -2,20 +2,46 @@ net6.0 - / + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Lion/AbpPro/SharedHostingMicroserviceModule.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Lion/AbpPro/SharedHostingMicroserviceModule.cs new file mode 100644 index 00000000..f811014a --- /dev/null +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Lion/AbpPro/SharedHostingMicroserviceModule.cs @@ -0,0 +1,122 @@ +using Microsoft.AspNetCore.DataProtection; +using StackExchange.Redis; +using Volo.Abp.Caching; + +namespace Lion.AbpPro; + +[DependsOn( + typeof(AbpSwashbuckleModule), + typeof(AbpAutofacModule), + typeof(LionAbpProCoreModule))] +public class SharedHostingMicroserviceModule : AbpModule +{ + private const string DefaultCorsPolicyName = "Default"; + + public override void ConfigureServices(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + context.Services.AddConsulConfig(configuration); + ConfigureHealthChecks(context); + ConfigureLocalization(); + ConfigureCors(context); + ConfigureConsul(context, configuration); + ConfigAntiForgery(); + ConfigureAbpExceptions(context); + } + + /// + /// 异常处理 + /// + private void ConfigureAbpExceptions(ServiceConfigurationContext context) + { + context.Services.AddMvc + ( + options => + { + options.Filters.Add(typeof(LionExceptionFilter)); + options.Filters.Add(typeof(LionResultFilter)); + } + ); + } + + /// + /// 阻止跨站点请求伪造 + /// https://docs.microsoft.com/zh-cn/aspnet/core/security/anti-request-forgery?view=aspnetcore-6.0 + /// + private void ConfigAntiForgery() + { + Configure(options => { options.AutoValidate = false; }); + } + + private void ConfigureConsul(ServiceConfigurationContext context, + IConfiguration configuration) + { + if (configuration.GetValue("Consul:Enabled", false)) + { + context.Services.AddConsulConfig(configuration); + } + } + + + /// + /// 配置跨域 + /// + private void ConfigureCors(ServiceConfigurationContext context) + { + var configuration = context.Services.GetConfiguration(); + context.Services.AddCors(options => + { + options.AddPolicy(DefaultCorsPolicyName, builder => + { + builder + .WithOrigins( + configuration["App:CorsOrigins"] + .Split(",", StringSplitOptions.RemoveEmptyEntries) + .Select(o => o.RemovePostFix("/")) + .ToArray() + ) + .WithAbpExposedHeaders() + .SetIsOriginAllowedToAllowWildcardSubdomains() + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials(); + }); + }); + } + + + + /// + /// 多语言配置 + /// + private void ConfigureLocalization() + { + Configure(options => + { + options.Languages.Add(new LanguageInfo("ar", "ar", "العربية")); + options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština")); + options.Languages.Add(new LanguageInfo("en", "en", "English")); + options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)")); + options.Languages.Add(new LanguageInfo("fr", "fr", "Français")); + options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar")); + options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português")); + options.Languages.Add(new LanguageInfo("ru", "ru", "Русский")); + options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe")); + options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); + options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文")); + options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch", "de")); + options.Languages.Add(new LanguageInfo("es", "es", "Español", "es")); + }); + } + + /// + /// 健康检查 + /// + /// + private void ConfigureHealthChecks(ServiceConfigurationContext context) + { + // TODO 检查数据库和redis是否正常 AspNetCore.HealthChecks.Redis AspNetCore.HealthChecks.MySql + // context.Services.AddHealthChecks().AddRedis(redisConnectionString).AddMySql(connectString); + context.Services.AddHealthChecks(); + } +} \ No newline at end of file diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/Builder/ApplicationBuilderExtensions.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/Builder/ApplicationBuilderExtensions.cs index 8e38a13d..c8461233 100644 --- a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/Builder/ApplicationBuilderExtensions.cs +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/Builder/ApplicationBuilderExtensions.cs @@ -1,8 +1,9 @@ -namespace Lion.AbpPro.Shared.Hosting.Microservices.Microsoft.AspNetCore.Builder +using Microsoft.AspNetCore.RequestLog; + +namespace Microsoft.AspNetCore.Builder { public static class ApplicationBuilderExtensions { - public static string UseConsul(this IApplicationBuilder app) { var appLifetime = app.ApplicationServices.GetService(); @@ -21,7 +22,7 @@ namespace Lion.AbpPro.Shared.Hosting.Microservices.Microsoft.AspNetCore.Builder string consulServiceId = $"{serviceName}:{serviceId}"; var client = scope.ServiceProvider.GetService(); - + var consulServiceRegistration = new AgentServiceRegistration { Name = serviceName, @@ -30,10 +31,10 @@ namespace Lion.AbpPro.Shared.Hosting.Microservices.Microsoft.AspNetCore.Builder Port = appUrl.Port, Check = new AgentServiceCheck { - DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务停止多久后注销 - Interval = TimeSpan.FromSeconds(3),//健康检查时间间隔,或者称为心跳 间隔 - HTTP = $"http://{appUrl.Host}:{appUrl.Port}/health",//健康检查地址 - Timeout = TimeSpan.FromSeconds(15) //超时时间 + DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5), //服务停止多久后注销 + Interval = TimeSpan.FromSeconds(3), //健康检查时间间隔,或者称为心跳 间隔 + HTTP = $"http://{appUrl.Host}:{appUrl.Port}/health", //健康检查地址 + Timeout = TimeSpan.FromSeconds(15) //超时时间 } }; @@ -42,5 +43,14 @@ namespace Lion.AbpPro.Shared.Hosting.Microservices.Microsoft.AspNetCore.Builder return consulServiceId; } + + /// + /// 记录请求响应日志 + /// + /// + public static IApplicationBuilder UseRequestLog(this IApplicationBuilder app) + { + return app.UseMiddleware(); + } } } \ No newline at end of file diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/Mvc/Filters/LionExceptionFilter.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/Mvc/Filters/LionExceptionFilter.cs index e88f7216..b4697529 100644 --- a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/Mvc/Filters/LionExceptionFilter.cs +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/Mvc/Filters/LionExceptionFilter.cs @@ -1,6 +1,6 @@ using System.Text; -namespace Microservices.Microsoft.AspNetCore.Mvc.Filters; +namespace Microsoft.AspNetCore.Mvc.Filters; public sealed class LionExceptionFilter : IAsyncExceptionFilter, ITransientDependency { diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/Mvc/Filters/LionResultFilter.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/Mvc/Filters/LionResultFilter.cs index 15c35779..d21d0536 100644 --- a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/Mvc/Filters/LionResultFilter.cs +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/Mvc/Filters/LionResultFilter.cs @@ -1,4 +1,4 @@ -namespace Microservices.Microsoft.AspNetCore.Mvc.Filters; +namespace Microsoft.AspNetCore.Mvc.Filters; public class LionResultFilter : IResultFilter, ITransientDependency { diff --git a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Middlewares/RequestLogMiddleware.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/RequestLog/RequestLogMiddleware.cs similarity index 98% rename from aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Middlewares/RequestLogMiddleware.cs rename to aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/RequestLog/RequestLogMiddleware.cs index fe7d4861..5f2f7779 100644 --- a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/Middlewares/RequestLogMiddleware.cs +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/AspNetCore/RequestLog/RequestLogMiddleware.cs @@ -1,4 +1,4 @@ -namespace Lion.AbpPro.Extensions.Middlewares; +namespace Microsoft.AspNetCore.RequestLog; public class RequestLogMiddleware { diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/Extensions/DependencyInjection/ServiceCollectionExtensions.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/Extensions/DependencyInjection/ServiceCollectionExtensions.cs index 145984a5..66533c21 100644 --- a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/Extensions/DependencyInjection/ServiceCollectionExtensions.cs +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Microsoft/Extensions/DependencyInjection/ServiceCollectionExtensions.cs @@ -1,4 +1,4 @@ -namespace Lion.AbpPro.Shared.Hosting.Microservices.Microsoft.Extensions.DependencyInjection +namespace Microsoft.Extensions.DependencyInjection { public static class ServiceCollectionExtensions { diff --git a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/SerilogToEsExtensions.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Serilog/SerilogToEsExtensions.cs similarity index 97% rename from aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/SerilogToEsExtensions.cs rename to aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Serilog/SerilogToEsExtensions.cs index 80d7fa41..3098d4c4 100644 --- a/aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Extensions/SerilogToEsExtensions.cs +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Serilog/SerilogToEsExtensions.cs @@ -1,7 +1,4 @@ -using Serilog.Exceptions; -using Serilog.Sinks.Elasticsearch; - -namespace Lion.AbpPro.Extensions +namespace Serilog { public static class SerilogToEsExtensions { diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/SharedHostingMicroserviceModule.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/SharedHostingMicroserviceModule.cs deleted file mode 100644 index ca4530a4..00000000 --- a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/SharedHostingMicroserviceModule.cs +++ /dev/null @@ -1,130 +0,0 @@ -using Microservices.Microsoft.AspNetCore.Mvc.Filters; - -namespace Lion.AbpPro.Shared.Hosting.Microservices -{ - [DependsOn( - typeof(AbpSwashbuckleModule), - typeof(AbpAutofacModule), - typeof(LionAbpProCoreModule))] - public class SharedHostingMicroserviceModule : AbpModule - { - private const string DefaultCorsPolicyName = "Default"; - - public override void ConfigureServices(ServiceConfigurationContext context) - { - var configuration = context.Services.GetConfiguration(); - context.Services.AddConsulConfig(configuration); - ConfigureHealthChecks(context); - ConfigureLocalization(); - ConfigureCors(context); - ConfigureUrls(configuration); - ConfigureConsul(context, configuration); - ConfigAntiForgery(); - ConfigureAbpExceptions(context); - } - - /// - /// 异常处理 - /// - private void ConfigureAbpExceptions(ServiceConfigurationContext context) - { - context.Services.AddMvc - ( - options => - { - options.Filters.Add(typeof(LionExceptionFilter)); - options.Filters.Add(typeof(LionResultFilter)); - } - ); - } - - /// - /// 阻止跨站点请求伪造 - /// https://docs.microsoft.com/zh-cn/aspnet/core/security/anti-request-forgery?view=aspnetcore-6.0 - /// - private void ConfigAntiForgery() - { - Configure(options => { options.AutoValidate = false; }); - } - - private void ConfigureConsul(ServiceConfigurationContext context, - IConfiguration configuration) - { - if (configuration.GetValue("Consul:Enabled", false)) - { - context.Services.AddConsulConfig(configuration); - } - } - - - /// - /// 配置跨域 - /// - private void ConfigureCors(ServiceConfigurationContext context) - { - var configuration = context.Services.GetConfiguration(); - context.Services.AddCors(options => - { - options.AddPolicy(DefaultCorsPolicyName, builder => - { - builder - .WithOrigins( - configuration["App:CorsOrigins"] - .Split(",", StringSplitOptions.RemoveEmptyEntries) - .Select(o => o.RemovePostFix("/")) - .ToArray() - ) - .WithAbpExposedHeaders() - .SetIsOriginAllowedToAllowWildcardSubdomains() - .AllowAnyHeader() - .AllowAnyMethod() - .AllowCredentials(); - }); - }); - } - - - /// - /// 站点配置 - /// - /// - private void ConfigureUrls(IConfiguration configuration) - { - Configure(options => { options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; }); - } - - /// - /// 多语言配置 - /// - private void ConfigureLocalization() - { - Configure(options => - { - options.Languages.Add(new LanguageInfo("ar", "ar", "العربية")); - options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština")); - options.Languages.Add(new LanguageInfo("en", "en", "English")); - options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)")); - options.Languages.Add(new LanguageInfo("fr", "fr", "Français")); - options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar")); - options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português")); - options.Languages.Add(new LanguageInfo("ru", "ru", "Русский")); - options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe")); - options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文")); - options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文")); - options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch", "de")); - options.Languages.Add(new LanguageInfo("es", "es", "Español", "es")); - }); - } - - /// - /// 健康检查 - /// - /// - private void ConfigureHealthChecks(ServiceConfigurationContext context) - { - // TODO 检查数据库和redis是否正常 AspNetCore.HealthChecks.Redis AspNetCore.HealthChecks.MySql - // context.Services.AddHealthChecks().AddRedis(redisConnectionString).AddMySql(connectString); - context.Services.AddHealthChecks(); - } - } -} \ No newline at end of file diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swagger/EnumSchemaFilter.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swagger/EnumSchemaFilter.cs new file mode 100644 index 00000000..1197d5de --- /dev/null +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swagger/EnumSchemaFilter.cs @@ -0,0 +1,21 @@ +namespace Swagger; + +/// +/// swagger 枚举映射, +/// 原因:前端代理生成枚举是数字 +/// +public class EnumSchemaFilter : ISchemaFilter +{ + public void Apply(OpenApiSchema schema, SchemaFilterContext context) + { + if (context.Type.IsEnum) + { + var array = new OpenApiArray(); + array.AddRange(Enum.GetNames(context.Type).Select(n => new OpenApiString(n))); + // NSwag + schema.Extensions.Add("x-enumNames", array); + // Openapi-generator + schema.Extensions.Add("x-enum-varnames", array); + } + } +} \ No newline at end of file diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swaggers/HiddenAbpDefaultApiFilter.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swagger/HiddenAbpDefaultApiFilter.cs similarity index 96% rename from aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swaggers/HiddenAbpDefaultApiFilter.cs rename to aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swagger/HiddenAbpDefaultApiFilter.cs index 11172991..34110bd4 100644 --- a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swaggers/HiddenAbpDefaultApiFilter.cs +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swagger/HiddenAbpDefaultApiFilter.cs @@ -1,4 +1,4 @@ -namespace Lion.AbpPro.Shared.Hosting.Microservices.Swaggers +namespace Swagger { /// /// 在使用nswag的时候,原生默认的api导致生产的代理类存在问题 diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swaggers/EnumSchemaFilter.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swaggers/EnumSchemaFilter.cs deleted file mode 100644 index 7965ee2a..00000000 --- a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Swaggers/EnumSchemaFilter.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace Lion.AbpPro.Shared.Hosting.Microservices.Swaggers -{ - /// - /// swagger 枚举映射, - /// 原因:前端代理生成枚举是数字 - /// - public class EnumSchemaFilter : ISchemaFilter - { - public void Apply(OpenApiSchema schema, SchemaFilterContext context) - { - if (context.Type.IsEnum) - { - var array = new OpenApiArray(); - array.AddRange(Enum.GetNames(context.Type).Select(n => new OpenApiString(n))); - // NSwag - schema.Extensions.Add("x-enumNames", array); - // Openapi-generator - schema.Extensions.Add("x-enum-varnames", array); - } - } - } -} \ No newline at end of file diff --git a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Volo/Abp/DefaultHttpExceptionStatusCodeFinder.cs b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Volo/Abp/DefaultHttpExceptionStatusCodeFinder.cs index 133e2b60..9b0c4e54 100644 --- a/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Volo/Abp/DefaultHttpExceptionStatusCodeFinder.cs +++ b/aspnet-core/shared/Lion.AbpPro.Shared.Hosting.Microservices/Volo/Abp/DefaultHttpExceptionStatusCodeFinder.cs @@ -1,4 +1,4 @@ -namespace Lion.AbpPro.Shared.Hosting.Microservices.Volo.Abp +namespace Volo.Abp { /// /// 修改Abp 返回状态码