Startup.cs 7.9 KB

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