Startup.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. using Autofac;
  2. using CLRStats;
  3. using FreeRedis;
  4. using Hangfire;
  5. using Hangfire.MemoryStorage;
  6. using Masuit.LuceneEFCore.SearchEngine;
  7. using Masuit.LuceneEFCore.SearchEngine.Extensions;
  8. using Masuit.MyBlogs.Core.Common;
  9. using Masuit.MyBlogs.Core.Common.Mails;
  10. using Masuit.MyBlogs.Core.Configs;
  11. using Masuit.MyBlogs.Core.Extensions;
  12. using Masuit.MyBlogs.Core.Extensions.DriveHelpers;
  13. using Masuit.MyBlogs.Core.Extensions.Firewall;
  14. using Masuit.MyBlogs.Core.Extensions.Hangfire;
  15. using Masuit.MyBlogs.Core.Infrastructure;
  16. using Masuit.MyBlogs.Core.Models.DTO;
  17. using Masuit.MyBlogs.Core.Models.Entity;
  18. using Masuit.MyBlogs.Core.Models.Enum;
  19. using Masuit.MyBlogs.Core.Models.ViewModel;
  20. using Masuit.Tools.AspNetCore.Mime;
  21. using Masuit.Tools.Config;
  22. using Masuit.Tools.Core.AspNetCore;
  23. using Masuit.Tools.Core.Net;
  24. using Microsoft.EntityFrameworkCore;
  25. using Microsoft.Extensions.Primitives;
  26. using Microsoft.IO;
  27. using Newtonsoft.Json;
  28. using Polly;
  29. using SixLabors.ImageSharp.Web.Caching;
  30. using SixLabors.ImageSharp.Web.Commands;
  31. using SixLabors.ImageSharp.Web.DependencyInjection;
  32. using SixLabors.ImageSharp.Web.Processors;
  33. using SixLabors.ImageSharp.Web.Providers;
  34. using System.Net;
  35. using System.Text.RegularExpressions;
  36. namespace Masuit.MyBlogs.Core
  37. {
  38. /// <summary>
  39. /// asp.net core核心配置
  40. /// </summary>
  41. public class Startup
  42. {
  43. /// <summary>
  44. /// 依赖注入容器
  45. /// </summary>
  46. public static IServiceProvider ServiceProvider { get; private set; }
  47. /// <summary>
  48. /// 配置中心
  49. /// </summary>
  50. public IConfiguration Configuration { get; set; }
  51. private readonly IWebHostEnvironment _env;
  52. /// <summary>
  53. /// asp.net core核心配置
  54. /// </summary>
  55. /// <param name="configuration"></param>
  56. public Startup(IConfiguration configuration, IWebHostEnvironment env)
  57. {
  58. _env = env;
  59. void BindConfig()
  60. {
  61. Configuration = configuration;
  62. AppConfig.ConnString = configuration["Database:" + nameof(AppConfig.ConnString)];
  63. AppConfig.BaiduAK = configuration[nameof(AppConfig.BaiduAK)];
  64. AppConfig.Redis = configuration[nameof(AppConfig.Redis)];
  65. AppConfig.TrueClientIPHeader = configuration[nameof(AppConfig.TrueClientIPHeader)] ?? "CF-Connecting-IP";
  66. AppConfig.EnableIPDirect = bool.Parse(configuration[nameof(AppConfig.EnableIPDirect)] ?? "false");
  67. configuration.Bind("Imgbed:Gitlabs", AppConfig.GitlabConfigs);
  68. configuration.AddToMasuitTools();
  69. }
  70. ChangeToken.OnChange(configuration.GetReloadToken, BindConfig);
  71. BindConfig();
  72. }
  73. /// <summary>
  74. /// ConfigureServices
  75. /// </summary>
  76. /// <param name="services"></param>
  77. /// <returns></returns>
  78. public void ConfigureServices(IServiceCollection services)
  79. {
  80. services.AddDbContext<DataContext>((serviceProvider, opt) => opt.UseNpgsql(AppConfig.ConnString, builder => builder.EnableRetryOnFailure(10)).EnableSensitiveDataLogging()); //配置数据库
  81. services.AddDbContext<LoggerDbContext>(opt => opt.UseNpgsql(AppConfig.ConnString)); //配置数据库
  82. services.ConfigureOptions();
  83. services.AddHttpsRedirection(options =>
  84. {
  85. options.RedirectStatusCode = StatusCodes.Status301MovedPermanently;
  86. });
  87. services.AddSession().AddAntiforgery(); //注入Session
  88. services.AddResponseCache().AddCacheConfig();
  89. services.AddHangfireServer().AddHangfire((serviceProvider, configuration) =>
  90. {
  91. configuration.UseActivator(new HangfireActivator(serviceProvider));
  92. configuration.UseFilter(new AutomaticRetryAttribute());
  93. configuration.UseMemoryStorage();
  94. }); //配置hangfire
  95. services.AddSevenZipCompressor().AddResumeFileResult().AddSearchEngine<DataContext>(new LuceneIndexerOptions()
  96. {
  97. Path = "lucene"
  98. }); // 配置7z和断点续传和Redis和Lucene搜索引擎
  99. services.AddHttpClient("").AddTransientHttpErrorPolicy(builder => builder.Or<TaskCanceledException>().Or<OperationCanceledException>().Or<TimeoutException>().OrResult(res => !res.IsSuccessStatusCode).RetryAsync(5)).ConfigurePrimaryHttpMessageHandler(() =>
  100. {
  101. if (bool.TryParse(Configuration["HttpClientProxy:Enabled"], out var b) && b)
  102. {
  103. return new HttpClientHandler
  104. {
  105. Proxy = new WebProxy(Configuration["HttpClientProxy:Uri"], true)
  106. };
  107. }
  108. return new HttpClientHandler();
  109. }); //注入HttpClient
  110. services.AddHttpClient<ImagebedClient>().AddTransientHttpErrorPolicy(builder => builder.Or<TaskCanceledException>().Or<OperationCanceledException>().Or<TimeoutException>().OrResult(res => !res.IsSuccessStatusCode).RetryAsync(3)); //注入HttpClient
  111. services.AddMailSender(Configuration).AddFirewallReporter(Configuration).AddRequestLogger(Configuration).AddPerfCounterManager(Configuration);
  112. services.AddBundling().UseDefaults(_env).UseNUglify().EnableMinification().EnableChangeDetection().EnableCacheHeader(TimeSpan.FromHours(1));
  113. services.AddSingleton<IRedisClient>(new RedisClient(AppConfig.Redis)
  114. {
  115. Serialize = JsonConvert.SerializeObject,
  116. Deserialize = JsonConvert.DeserializeObject
  117. });
  118. services.SetupMiniProfile();
  119. services.AddSingleton<IMimeMapper, MimeMapper>(p => new MimeMapper());
  120. services.AddOneDrive();
  121. services.AutoRegisterServices();
  122. services.AddRazorPages();
  123. services.AddServerSideBlazor();
  124. services.AddMapper().AddMyMvc().AddHealthChecks();
  125. services.AddImageSharp(options =>
  126. {
  127. options.MemoryStreamManager = new RecyclableMemoryStreamManager();
  128. options.BrowserMaxAge = TimeSpan.FromDays(7);
  129. options.CacheMaxAge = TimeSpan.FromDays(365);
  130. options.Configuration = SixLabors.ImageSharp.Configuration.Default;
  131. }).SetRequestParser<QueryCollectionRequestParser>()
  132. .Configure<PhysicalFileSystemCacheOptions>(options =>
  133. {
  134. options.CacheRootPath = null;
  135. options.CacheFolder = "static/image_cache";
  136. })
  137. .SetCache<PhysicalFileSystemCache>()
  138. .SetCacheKey<UriRelativeLowerInvariantCacheKey>()
  139. .SetCacheHash<SHA256CacheHash>()
  140. .Configure<PhysicalFileSystemProviderOptions>(options =>
  141. {
  142. options.ProviderRootPath = null;
  143. })
  144. .AddProvider<PhysicalFileSystemProvider>()
  145. .AddProcessor<ResizeWebProcessor>()
  146. .AddProcessor<FormatWebProcessor>()
  147. .AddProcessor<BackgroundColorWebProcessor>()
  148. .AddProcessor<QualityWebProcessor>()
  149. .AddProcessor<AutoOrientWebProcessor>();
  150. }
  151. public void ConfigureContainer(ContainerBuilder builder)
  152. {
  153. builder.RegisterModule(new AutofacModule());
  154. }
  155. /// <summary>
  156. /// Configure
  157. /// </summary>
  158. /// <param name="app"></param>
  159. /// <param name="env"></param>
  160. /// <param name="hangfire"></param>
  161. /// <param name="luceneIndexerOptions"></param>
  162. public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IHangfireBackJob hangfire, LuceneIndexerOptions luceneIndexerOptions, DataContext maindb, LoggerDbContext loggerdb)
  163. {
  164. maindb.FastShare.AddOrUpdate(s => new[] { s.Title, s.Link }, new[]{new FastShare
  165. {
  166. Status = Status.Default,
  167. Title = "title",
  168. Link = "link",
  169. Sort = 0
  170. }});
  171. ServiceProvider = app.ApplicationServices;
  172. maindb.Database.EnsureCreated();
  173. loggerdb.Database.EnsureCreated();
  174. maindb.Advertisements.Where(a => a.Id == 159).ExecuteUpdate(e => e.SetProperty(a => a.DisplayCount, a => a.DisplayCount + 1));
  175. app.InitSettings();
  176. app.UseLuceneSearch(env, hangfire, luceneIndexerOptions);
  177. app.UseForwardedHeaders().UseCertificateForwarding(); // X-Forwarded-For
  178. if (env.IsDevelopment())
  179. {
  180. app.UseDeveloperExceptionPage();
  181. }
  182. else
  183. {
  184. app.UseExceptionHandler("/ServiceUnavailable");
  185. }
  186. app.UseBundles();
  187. app.SetupHttpsRedirection(Configuration);
  188. app.UseDefaultFiles().UseWhen(c => Regex.IsMatch(c.Request.Path.Value + "", @"(\.jpg|\.jpeg|\.png|\.bmp|\.webp|\.tiff|\.pbm)$", RegexOptions.IgnoreCase), builder => builder.UseImageSharp()).UseStaticFiles();
  189. app.UseSession().UseCookiePolicy(); //注入Session
  190. app.UseWhen(c => c.Session.Get<UserInfoDto>(SessionKey.UserInfo)?.IsAdmin == true, builder =>
  191. {
  192. builder.UseMiniProfiler();
  193. builder.UseCLRStatsDashboard();
  194. });
  195. app.UseWhen(c => !c.Request.Path.StartsWithSegments("/_blazor"), builder => builder.UseMiddleware<RequestInterceptMiddleware>()); //启用网站请求拦截
  196. app.SetupHangfire();
  197. app.UseResponseCaching().UseResponseCompression(); //启动Response缓存
  198. app.UseMiddleware<TranslateMiddleware>();
  199. app.UseRouting().UseEndpoints(endpoints =>
  200. {
  201. endpoints.MapBlazorHub(options =>
  202. {
  203. options.ApplicationMaxBufferSize = 4194304;
  204. options.LongPolling.PollTimeout = TimeSpan.FromSeconds(10);
  205. options.TransportMaxBufferSize = 8388608;
  206. });
  207. endpoints.MapHealthChecks("/health");
  208. endpoints.MapControllers(); // 属性路由
  209. endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}"); // 默认路由
  210. endpoints.MapFallbackToController("Index", "Error");
  211. });
  212. Console.WriteLine("网站启动完成");
  213. }
  214. }
  215. }