临河任务调度
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

277 lines
11KB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using IdentityModel;
  6. using Microsoft.AspNetCore.Authentication.JwtBearer;
  7. using Microsoft.AspNetCore.Builder;
  8. using Microsoft.AspNetCore.Cors;
  9. using Microsoft.AspNetCore.DataProtection;
  10. using Microsoft.Extensions.Configuration;
  11. using Microsoft.Extensions.DependencyInjection;
  12. using Microsoft.Extensions.Hosting;
  13. using Himp.TaskScheduling.EntityFrameworkCore;
  14. using Himp.TaskScheduling.MultiTenancy;
  15. using StackExchange.Redis;
  16. using Microsoft.OpenApi.Models;
  17. using Volo.Abp;
  18. using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy;
  19. using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared;
  20. using Volo.Abp.AspNetCore.Serilog;
  21. using Volo.Abp.AuditLogging.EntityFrameworkCore;
  22. using Volo.Abp.Autofac;
  23. using Volo.Abp.Caching;
  24. using Volo.Abp.Caching.StackExchangeRedis;
  25. using Volo.Abp.EntityFrameworkCore;
  26. using Volo.Abp.EntityFrameworkCore.SqlServer;
  27. using Volo.Abp.Localization;
  28. using Volo.Abp.Modularity;
  29. using Volo.Abp.MultiTenancy;
  30. using Volo.Abp.PermissionManagement.EntityFrameworkCore;
  31. using Volo.Abp.Security.Claims;
  32. using Volo.Abp.SettingManagement.EntityFrameworkCore;
  33. using Volo.Abp.Swashbuckle;
  34. using Volo.Abp.TenantManagement.EntityFrameworkCore;
  35. using Volo.Abp.VirtualFileSystem;
  36. using Asp.Versioning.ApplicationModels;
  37. using Volo.Abp.AspNetCore.Mvc;
  38. namespace Himp.TaskScheduling;
  39. [DependsOn(
  40. typeof(TaskSchedulingApplicationModule),
  41. typeof(TaskSchedulingEntityFrameworkCoreModule),
  42. typeof(TaskSchedulingHttpApiModule),
  43. typeof(AbpAspNetCoreMvcUiMultiTenancyModule),
  44. typeof(AbpAutofacModule),
  45. typeof(AbpCachingStackExchangeRedisModule),
  46. typeof(AbpEntityFrameworkCoreSqlServerModule),
  47. //typeof(AbpAuditLoggingEntityFrameworkCoreModule),
  48. //typeof(AbpPermissionManagementEntityFrameworkCoreModule),
  49. //typeof(AbpSettingManagementEntityFrameworkCoreModule),
  50. //typeof(AbpTenantManagementEntityFrameworkCoreModule),
  51. typeof(AbpAspNetCoreSerilogModule),
  52. typeof(AbpSwashbuckleModule)
  53. )]
  54. public class TaskSchedulingHttpApiHostModule : AbpModule
  55. {
  56. public override void ConfigureServices(ServiceConfigurationContext context)
  57. {
  58. //System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
  59. var hostingEnvironment = context.Services.GetHostingEnvironment();
  60. var configuration = context.Services.GetConfiguration();
  61. Configure<AbpDbContextOptions>(options =>
  62. {
  63. options.UseSqlServer();
  64. });
  65. Configure<AbpMultiTenancyOptions>(options =>
  66. {
  67. options.IsEnabled = MultiTenancyConsts.IsEnabled;
  68. });
  69. ConfigureHangfire(context, configuration);
  70. if (hostingEnvironment.IsDevelopment())
  71. {
  72. Configure<AbpVirtualFileSystemOptions>(options =>
  73. {
  74. options.FileSets.ReplaceEmbeddedByPhysical<TaskSchedulingDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Himp.TaskScheduling.Domain.Shared", Path.DirectorySeparatorChar)));
  75. options.FileSets.ReplaceEmbeddedByPhysical<TaskSchedulingDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Himp.TaskScheduling.Domain", Path.DirectorySeparatorChar)));
  76. options.FileSets.ReplaceEmbeddedByPhysical<TaskSchedulingApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Himp.TaskScheduling.Application.Contracts", Path.DirectorySeparatorChar)));
  77. options.FileSets.ReplaceEmbeddedByPhysical<TaskSchedulingApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Himp.TaskScheduling.Application", Path.DirectorySeparatorChar)));
  78. });
  79. }
  80. context.Services.AddAbpSwaggerGenWithOAuth(
  81. configuration["AuthServer:Authority"]!,
  82. new Dictionary<string, string>
  83. {
  84. {"TaskScheduling", "TaskScheduling API"}
  85. },
  86. options =>
  87. {
  88. options.SwaggerDoc("v1", new OpenApiInfo {Title = "TaskScheduling API", Version = "v1"});
  89. options.DocInclusionPredicate((docName, description) => true);
  90. options.CustomSchemaIds(type => type.FullName);
  91. });
  92. context.Services.AddHttpClient();
  93. Configure<AbpLocalizationOptions>(options =>
  94. {
  95. options.Languages.Add(new LanguageInfo("ar", "ar", "العربية"));
  96. options.Languages.Add(new LanguageInfo("cs", "cs", "Čeština"));
  97. options.Languages.Add(new LanguageInfo("en", "en", "English"));
  98. options.Languages.Add(new LanguageInfo("en-GB", "en-GB", "English (UK)"));
  99. options.Languages.Add(new LanguageInfo("fi", "fi", "Finnish"));
  100. options.Languages.Add(new LanguageInfo("fr", "fr", "Français"));
  101. options.Languages.Add(new LanguageInfo("hi", "hi", "Hindi"));
  102. options.Languages.Add(new LanguageInfo("is", "is", "Icelandic"));
  103. options.Languages.Add(new LanguageInfo("it", "it", "Italiano"));
  104. options.Languages.Add(new LanguageInfo("hu", "hu", "Magyar"));
  105. options.Languages.Add(new LanguageInfo("pt-BR", "pt-BR", "Português"));
  106. options.Languages.Add(new LanguageInfo("ro-RO", "ro-RO", "Română"));
  107. options.Languages.Add(new LanguageInfo("ru", "ru", "Русский"));
  108. options.Languages.Add(new LanguageInfo("sk", "sk", "Slovak"));
  109. options.Languages.Add(new LanguageInfo("tr", "tr", "Türkçe"));
  110. options.Languages.Add(new LanguageInfo("zh-Hans", "zh-Hans", "简体中文"));
  111. options.Languages.Add(new LanguageInfo("zh-Hant", "zh-Hant", "繁體中文"));
  112. options.Languages.Add(new LanguageInfo("de-DE", "de-DE", "Deutsch"));
  113. options.Languages.Add(new LanguageInfo("es", "es", "Español"));
  114. options.Languages.Add(new LanguageInfo("el", "el", "Ελληνικά"));
  115. });
  116. //var redisConnectionString = configuration.GetConnectionString("Redis");
  117. //var redis = ConnectionMultiplexer.Connect(redisConnectionString);
  118. //context.Services.AddSingleton<IConnectionMultiplexer>(redis);
  119. //context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  120. // .AddJwtBearer(options =>
  121. // {
  122. // options.Authority = configuration["AuthServer:Authority"];
  123. // options.RequireHttpsMetadata = configuration.GetValue<bool>("AuthServer:RequireHttpsMetadata");
  124. // options.Audience = "TaskScheduling";
  125. // });
  126. Configure<AbpDistributedCacheOptions>(options =>
  127. {
  128. options.KeyPrefix = "TaskScheduling:";
  129. });
  130. var dataProtectionBuilder = context.Services.AddDataProtection().SetApplicationName("TaskScheduling");
  131. if (!hostingEnvironment.IsDevelopment())
  132. {
  133. var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
  134. dataProtectionBuilder.PersistKeysToStackExchangeRedis(redis, "TaskScheduling-Protection-Keys");
  135. }
  136. context.Services.AddCors(options =>
  137. {
  138. options.AddDefaultPolicy(builder =>
  139. {
  140. builder
  141. .WithOrigins(
  142. configuration["App:CorsOrigins"]?
  143. .Split(",", StringSplitOptions.RemoveEmptyEntries)
  144. .Select(o => o.RemovePostFix("/"))
  145. .ToArray() ?? Array.Empty<string>()
  146. )
  147. .WithAbpExposedHeaders()
  148. .SetIsOriginAllowedToAllowWildcardSubdomains()
  149. .AllowAnyHeader()
  150. .AllowAnyMethod()
  151. .AllowCredentials();
  152. });
  153. });
  154. //versionless APIs
  155. context.Services.AddTransient<IApiControllerFilter, NoControllerFilter>();
  156. context.Services.AddAbpApiVersioning(options =>
  157. {
  158. options.ReportApiVersions = true;
  159. options.AssumeDefaultVersionWhenUnspecified = true;
  160. });
  161. Configure<AbpAspNetCoreMvcOptions>(options =>
  162. {
  163. options.ChangeControllerModelApiExplorerGroupName = false;
  164. });
  165. context.Services.AddHttpClient();
  166. //context.Services.AddElsa(elsa =>
  167. //{
  168. // // Configure Management layer to use EF Core.
  169. // elsa.UseWorkflowManagement(management => management.UseEntityFrameworkCore());
  170. // // Configure Runtime layer to use EF Core.
  171. // elsa.UseWorkflowRuntime(runtime => runtime.UseEntityFrameworkCore());
  172. // // Default Identity features for authentication/authorization.
  173. // elsa.UseIdentity(identity =>
  174. // {
  175. // identity.TokenOptions = options => options.SigningKey = "sufficiently-large-secret-signing-key"; // This key needs to be at least 256 bits long.
  176. // identity.UseAdminUserProvider();
  177. // });
  178. // // Configure ASP.NET authentication/authorization.
  179. // elsa.UseDefaultAuthentication(auth => auth.UseAdminApiKey());
  180. // // Expose Elsa API endpoints.
  181. // elsa.UseWorkflowsApi();
  182. // // Setup a SignalR hub for real-time updates from the server.
  183. // elsa.UseRealTimeWorkflows();
  184. // // Enable JavaScript workflow expressions
  185. // elsa.UseJavaScript(options => options.AllowClrAccess = true);
  186. // // Enable HTTP activities.
  187. // elsa.UseHttp();
  188. // // Register custom activities from the application, if any.
  189. // elsa.AddActivitiesFrom<Program>();
  190. // // Register custom workflows from the application, if any.
  191. // elsa.AddWorkflowsFrom<Program>();
  192. //});
  193. }
  194. private void ConfigureHangfire(ServiceConfigurationContext context, IConfiguration configuration)
  195. {
  196. //context.Services.AddHangfire(config =>
  197. //{
  198. // config.UseSqlServerStorage(configuration.GetConnectionString("Default"));
  199. //});
  200. }
  201. public override void OnApplicationInitialization(ApplicationInitializationContext context)
  202. {
  203. var app = context.GetApplicationBuilder();
  204. var env = context.GetEnvironment();
  205. if (env.IsDevelopment())
  206. {
  207. app.UseDeveloperExceptionPage();
  208. app.UseSwagger();
  209. app.UseAbpSwaggerUI(options =>
  210. {
  211. options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API");
  212. var configuration = context.GetConfiguration();
  213. options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
  214. options.OAuthScopes("TaskScheduling");
  215. });
  216. }
  217. else
  218. {
  219. app.UseHsts();
  220. }
  221. app.UseHttpsRedirection();
  222. app.UseCorrelationId();
  223. app.UseStaticFiles();
  224. app.UseRouting();
  225. app.UseCors();
  226. //app.UseAuthentication();
  227. //app.UseAbpHangfireDashboard();
  228. //app.UseWorkflowsApi();
  229. //app.UseWorkflows();
  230. if (MultiTenancyConsts.IsEnabled)
  231. {
  232. app.UseMultiTenancy();
  233. }
  234. app.UseAbpRequestLocalization();
  235. //app.UseAuthorization();
  236. app.UseAuditing();
  237. app.UseAbpSerilogEnrichers();
  238. app.UseConfiguredEndpoints();
  239. }
  240. }