24 changed files with 230 additions and 205 deletions
@ -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; |
|||
} |
|||
@ -1,13 +0,0 @@ |
|||
namespace Microsoft.AspNetCore.Builder; |
|||
|
|||
public static class AbpProApplicationBuilderExtensionsExtensions |
|||
{ |
|||
/// <summary>
|
|||
/// 记录请求响应日志
|
|||
/// </summary>
|
|||
/// <returns></returns>
|
|||
public static IApplicationBuilder UseRequestLog(this IApplicationBuilder app) |
|||
{ |
|||
return app.UseMiddleware<RequestLogMiddleware>(); |
|||
} |
|||
} |
|||
@ -1,4 +1,4 @@ |
|||
namespace Lion.AbpPro.Shared.Hosting.Gateways |
|||
namespace Lion.AbpPro |
|||
{ |
|||
[DependsOn( |
|||
typeof(AbpSwashbuckleModule), |
|||
@ -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); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 异常处理
|
|||
/// </summary>
|
|||
private void ConfigureAbpExceptions(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services.AddMvc |
|||
( |
|||
options => |
|||
{ |
|||
options.Filters.Add(typeof(LionExceptionFilter)); |
|||
options.Filters.Add(typeof(LionResultFilter)); |
|||
} |
|||
); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 阻止跨站点请求伪造
|
|||
/// https://docs.microsoft.com/zh-cn/aspnet/core/security/anti-request-forgery?view=aspnetcore-6.0
|
|||
/// </summary>
|
|||
private void ConfigAntiForgery() |
|||
{ |
|||
Configure<AbpAntiForgeryOptions>(options => { options.AutoValidate = false; }); |
|||
} |
|||
|
|||
private void ConfigureConsul(ServiceConfigurationContext context, |
|||
IConfiguration configuration) |
|||
{ |
|||
if (configuration.GetValue<bool>("Consul:Enabled", false)) |
|||
{ |
|||
context.Services.AddConsulConfig(configuration); |
|||
} |
|||
} |
|||
|
|||
|
|||
/// <summary>
|
|||
/// 配置跨域
|
|||
/// </summary>
|
|||
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(); |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
|
|||
|
|||
/// <summary>
|
|||
/// 多语言配置
|
|||
/// </summary>
|
|||
private void ConfigureLocalization() |
|||
{ |
|||
Configure<AbpLocalizationOptions>(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")); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 健康检查
|
|||
/// </summary>
|
|||
/// <param name="context"></param>
|
|||
private void ConfigureHealthChecks(ServiceConfigurationContext context) |
|||
{ |
|||
// TODO 检查数据库和redis是否正常 AspNetCore.HealthChecks.Redis AspNetCore.HealthChecks.MySql
|
|||
// context.Services.AddHealthChecks().AddRedis(redisConnectionString).AddMySql(connectString);
|
|||
context.Services.AddHealthChecks(); |
|||
} |
|||
} |
|||
@ -1,4 +1,4 @@ |
|||
namespace Lion.AbpPro.Extensions.Middlewares; |
|||
namespace Microsoft.AspNetCore.RequestLog; |
|||
|
|||
public class RequestLogMiddleware |
|||
{ |
|||
@ -1,7 +1,4 @@ |
|||
using Serilog.Exceptions; |
|||
using Serilog.Sinks.Elasticsearch; |
|||
|
|||
namespace Lion.AbpPro.Extensions |
|||
namespace Serilog |
|||
{ |
|||
public static class SerilogToEsExtensions |
|||
{ |
|||
@ -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); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 异常处理
|
|||
/// </summary>
|
|||
private void ConfigureAbpExceptions(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services.AddMvc |
|||
( |
|||
options => |
|||
{ |
|||
options.Filters.Add(typeof(LionExceptionFilter)); |
|||
options.Filters.Add(typeof(LionResultFilter)); |
|||
} |
|||
); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 阻止跨站点请求伪造
|
|||
/// https://docs.microsoft.com/zh-cn/aspnet/core/security/anti-request-forgery?view=aspnetcore-6.0
|
|||
/// </summary>
|
|||
private void ConfigAntiForgery() |
|||
{ |
|||
Configure<AbpAntiForgeryOptions>(options => { options.AutoValidate = false; }); |
|||
} |
|||
|
|||
private void ConfigureConsul(ServiceConfigurationContext context, |
|||
IConfiguration configuration) |
|||
{ |
|||
if (configuration.GetValue<bool>("Consul:Enabled", false)) |
|||
{ |
|||
context.Services.AddConsulConfig(configuration); |
|||
} |
|||
} |
|||
|
|||
|
|||
/// <summary>
|
|||
/// 配置跨域
|
|||
/// </summary>
|
|||
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(); |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
|
|||
/// <summary>
|
|||
/// 站点配置
|
|||
/// </summary>
|
|||
/// <param name="configuration"></param>
|
|||
private void ConfigureUrls(IConfiguration configuration) |
|||
{ |
|||
Configure<AppUrlOptions>(options => { options.Applications["MVC"].RootUrl = configuration["App:SelfUrl"]; }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 多语言配置
|
|||
/// </summary>
|
|||
private void ConfigureLocalization() |
|||
{ |
|||
Configure<AbpLocalizationOptions>(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")); |
|||
}); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 健康检查
|
|||
/// </summary>
|
|||
/// <param name="context"></param>
|
|||
private void ConfigureHealthChecks(ServiceConfigurationContext context) |
|||
{ |
|||
// TODO 检查数据库和redis是否正常 AspNetCore.HealthChecks.Redis AspNetCore.HealthChecks.MySql
|
|||
// context.Services.AddHealthChecks().AddRedis(redisConnectionString).AddMySql(connectString);
|
|||
context.Services.AddHealthChecks(); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
namespace Swagger; |
|||
|
|||
/// <summary>
|
|||
/// swagger 枚举映射,
|
|||
/// 原因:前端代理生成枚举是数字
|
|||
/// </summary>
|
|||
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); |
|||
} |
|||
} |
|||
} |
|||
@ -1,4 +1,4 @@ |
|||
namespace Lion.AbpPro.Shared.Hosting.Microservices.Swaggers |
|||
namespace Swagger |
|||
{ |
|||
/// <summary>
|
|||
/// 在使用nswag的时候,原生默认的api导致生产的代理类存在问题
|
|||
@ -1,22 +0,0 @@ |
|||
namespace Lion.AbpPro.Shared.Hosting.Microservices.Swaggers |
|||
{ |
|||
/// <summary>
|
|||
/// swagger 枚举映射,
|
|||
/// 原因:前端代理生成枚举是数字
|
|||
/// </summary>
|
|||
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); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue