Startup.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. using Autofac;
  2. using Autofac.Extensions.DependencyInjection;
  3. using CSRedis;
  4. using EFCoreSecondLevelCacheInterceptor;
  5. using Hangfire;
  6. using Hangfire.MemoryStorage;
  7. using Masuit.LuceneEFCore.SearchEngine;
  8. using Masuit.LuceneEFCore.SearchEngine.Extensions;
  9. using Masuit.MyBlogs.Core.Common;
  10. using Masuit.MyBlogs.Core.Common.Mails;
  11. using Masuit.MyBlogs.Core.Configs;
  12. using Masuit.MyBlogs.Core.Extensions;
  13. using Masuit.MyBlogs.Core.Extensions.DriveHelpers;
  14. using Masuit.MyBlogs.Core.Extensions.Firewall;
  15. using Masuit.MyBlogs.Core.Extensions.Hangfire;
  16. using Masuit.MyBlogs.Core.Infrastructure;
  17. using Masuit.MyBlogs.Core.Models.DTO;
  18. using Masuit.MyBlogs.Core.Models.ViewModel;
  19. using Masuit.Tools.Config;
  20. using Masuit.Tools.Core.AspNetCore;
  21. using Masuit.Tools.Core.Net;
  22. using Microsoft.AspNetCore.Builder;
  23. using Microsoft.AspNetCore.Hosting;
  24. using Microsoft.AspNetCore.Http;
  25. using Microsoft.EntityFrameworkCore;
  26. using Microsoft.Extensions.Configuration;
  27. using Microsoft.Extensions.DependencyInjection;
  28. using Microsoft.Extensions.Hosting;
  29. using Microsoft.Extensions.Primitives;
  30. using Polly;
  31. using System;
  32. using System.Threading.Tasks;
  33. namespace Masuit.MyBlogs.Core
  34. {
  35. /// <summary>
  36. /// asp.net core核心配置
  37. /// </summary>
  38. public class Startup
  39. {
  40. /// <summary>
  41. /// 依赖注入容器
  42. /// </summary>
  43. public static IServiceProvider ServiceProvider { get; private set; }
  44. /// <summary>
  45. /// 配置中心
  46. /// </summary>
  47. public IConfiguration Configuration { get; set; }
  48. private readonly IWebHostEnvironment _env;
  49. /// <summary>
  50. /// asp.net core核心配置
  51. /// </summary>
  52. /// <param name="configuration"></param>
  53. public Startup(IConfiguration configuration, IWebHostEnvironment env)
  54. {
  55. _env = env;
  56. void BindConfig()
  57. {
  58. Configuration = configuration;
  59. AppConfig.ConnString = configuration[nameof(AppConfig.ConnString)];
  60. AppConfig.BaiduAK = configuration[nameof(AppConfig.BaiduAK)];
  61. AppConfig.Redis = configuration[nameof(AppConfig.Redis)];
  62. AppConfig.TrueClientIPHeader = configuration[nameof(AppConfig.TrueClientIPHeader)] ?? "CF-Connecting-IP";
  63. AppConfig.EnableIPDirect = bool.Parse(configuration[nameof(AppConfig.EnableIPDirect)] ?? "false");
  64. configuration.Bind("Imgbed:AliyunOSS", AppConfig.AliOssConfig);
  65. configuration.Bind("Imgbed:Gitlabs", AppConfig.GitlabConfigs);
  66. configuration.AddToMasuitTools();
  67. }
  68. ChangeToken.OnChange(configuration.GetReloadToken, BindConfig);
  69. BindConfig();
  70. }
  71. /// <summary>
  72. /// ConfigureServices
  73. /// </summary>
  74. /// <param name="services"></param>
  75. /// <returns></returns>
  76. public void ConfigureServices(IServiceCollection services)
  77. {
  78. RedisHelper.Initialization(new CSRedisClient(AppConfig.Redis));
  79. services.AddEFSecondLevelCache(options => options.UseCustomCacheProvider<MyEFCacheManagerCoreProvider>(CacheExpirationMode.Absolute, TimeSpan.FromMinutes(5)).DisableLogging(true));
  80. services.AddDbContextPool<DataContext>((serviceProvider, opt) =>
  81. {
  82. opt.UseMySql(AppConfig.ConnString, ServerVersion.AutoDetect(AppConfig.ConnString), builder => builder.EnableRetryOnFailure(3)).EnableDetailedErrors().UseLazyLoadingProxies().UseQueryTrackingBehavior(QueryTrackingBehavior.TrackAll).AddInterceptors(serviceProvider.GetRequiredService<SecondLevelCacheInterceptor>());
  83. }); //配置数据库
  84. services.ConfigureOptions();
  85. services.AddHttpsRedirection(options =>
  86. {
  87. options.RedirectStatusCode = StatusCodes.Status301MovedPermanently;
  88. });
  89. services.AddSession().AddAntiforgery(); //注入Session
  90. services.AddResponseCache().AddCacheConfig();
  91. services.AddHangfire((_, configuration) =>
  92. {
  93. configuration.UseFilter(new AutomaticRetryAttribute());
  94. configuration.UseMemoryStorage();
  95. }); //配置hangfire
  96. services.AddSevenZipCompressor().AddResumeFileResult().AddSearchEngine<DataContext>(new LuceneIndexerOptions()
  97. {
  98. Path = "lucene"
  99. }); // 配置7z和断点续传和Redis和Lucene搜索引擎
  100. services.AddHttpClient("", c => c.Timeout = TimeSpan.FromSeconds(30)).AddTransientHttpErrorPolicy(builder => builder.Or<TaskCanceledException>().Or<OperationCanceledException>().Or<TimeoutException>().OrResult(res => !res.IsSuccessStatusCode).RetryAsync(5)); //注入HttpClient
  101. services.AddHttpClient<ImagebedClient>().AddTransientHttpErrorPolicy(builder => builder.Or<TaskCanceledException>().Or<OperationCanceledException>().Or<TimeoutException>().OrResult(res => !res.IsSuccessStatusCode).RetryAsync(5));
  102. services.AddMailSender(Configuration).AddFirewallReporter(Configuration);
  103. services.AddBundling().UseDefaults(_env).UseNUglify().EnableMinification().EnableChangeDetection().EnableCacheHeader(TimeSpan.FromHours(1));
  104. services.SetupMiniProfile();
  105. services.AddOneDrive();
  106. services.AddRazorPages();
  107. services.AddServerSideBlazor();
  108. services.AddMapper().AddAutofac().AddMyMvc();
  109. }
  110. public void ConfigureContainer(ContainerBuilder builder)
  111. {
  112. builder.RegisterModule(new AutofacModule());
  113. }
  114. /// <summary>
  115. /// Configure
  116. /// </summary>
  117. /// <param name="app"></param>
  118. /// <param name="env"></param>
  119. /// <param name="db"></param>
  120. /// <param name="hangfire"></param>
  121. /// <param name="luceneIndexerOptions"></param>
  122. public void Configure(IApplicationBuilder app, IWebHostEnvironment env, DataContext db, IHangfireBackJob hangfire, LuceneIndexerOptions luceneIndexerOptions)
  123. {
  124. ServiceProvider = app.ApplicationServices;
  125. db.Database.EnsureCreated();
  126. app.InitSettings();
  127. app.UseLuceneSearch(env, hangfire, luceneIndexerOptions);
  128. app.UseForwardedHeaders().UseCertificateForwarding(); // X-Forwarded-For
  129. if (env.IsDevelopment())
  130. {
  131. app.UseDeveloperExceptionPage();
  132. }
  133. else
  134. {
  135. app.UseExceptionHandler("/ServiceUnavailable");
  136. }
  137. app.UseBundles();
  138. app.SetupHttpsRedirection(Configuration);
  139. app.UseDefaultFiles().UseStaticFiles();
  140. app.UseSession().UseCookiePolicy(); //注入Session
  141. app.UseWhen(c => c.Session.Get<UserInfoDto>(SessionKey.UserInfo)?.IsAdmin == true, builder => builder.UseMiniProfiler());
  142. app.UseWhen(c => !c.Request.Path.StartsWithSegments("/_blazor"), builder => builder.UseMiddleware<RequestInterceptMiddleware>()); //启用网站请求拦截
  143. app.SetupHangfire();
  144. app.UseResponseCaching().UseResponseCompression(); //启动Response缓存
  145. app.UseMiddleware<TranslateMiddleware>();
  146. app.UseRouting().UseEndpoints(endpoints =>
  147. {
  148. endpoints.MapBlazorHub(options =>
  149. {
  150. options.ApplicationMaxBufferSize = 4194304;
  151. options.LongPolling.PollTimeout = TimeSpan.FromSeconds(10);
  152. options.TransportMaxBufferSize = 8388608;
  153. });
  154. endpoints.MapControllers(); // 属性路由
  155. endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}"); // 默认路由
  156. endpoints.MapFallbackToController("Index", "Error");
  157. });
  158. Console.WriteLine("网站启动完成");
  159. }
  160. }
  161. }