nopCommerce 3.9 大波浪系列 之 global.asax
一.nop的global.asax文件
nop3.9基於ASP.NET MVC 5框架開發,而ASP.NET MVC中global.asax文件包含全局應用程序事件的事件處理程序,它響應應用程序級別和會話級別事件的代碼。
nop應用啟動時調用 Application_Start
客戶端請求時依次調用 Application_BeginRequest,Application_AuthenticateRequest,Application_EndRequest
請求未處理異常時調用 Application_Error
二.Application_Start做了什麽?
當應用啟動的時候調用Application_Start()進行初始化
1.指定傳輸層安全 (TLS) 1.2 安全協議。
2.隱藏header "X-AspNetMvc-Version" 屬性
3.初始化nop引擎:EngineContext
4.初始化nop自帶的視圖引擎:ThemeableRazorViewEngine
5.初始化nop自帶的模型元數據提供者:NopMetadataProvider
6.註冊路由
7.初始化 Fluent validation(asp.net mvc model 驗證框架) 進行MVC中Model驗證
8.初始化任務管理器
9.初始化Miniprofiler進行性能分析(nop默認是關閉的)
10.記錄啟動日誌
1 /// <summary>protected void Application_Start()2 /// 1. 3 /// 不是每次請求都調用 4 /// 在Web應用程序的生命周期裏就執行一次 5 /// 在應用程序第一次啟動和應用程序域創建事被調用 6 /// 適合處理應用程序範圍的初始化代碼 7 /// </summary> 8 protected void Application_Start() 9 { 10 //指定傳輸層安全 (TLS) 1.2 安全協議 11 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 1213 //隱藏header "X-AspNetMvc-Version" 屬性 14 //disable "X-AspNetMvc-Version" header name 15 MvcHandler.DisableMvcResponseHeader = true; 16 17 //初始化引擎 18 EngineContext.Initialize(false); 19 20 //判斷是否安裝數據庫 21 bool databaseInstalled = DataSettingsHelper.DatabaseIsInstalled(); 22 if (databaseInstalled) 23 { 24 //remove all view engines 移除視圖引擎 25 ViewEngines.Engines.Clear(); 26 //except the themeable razor view engine we use 使用nop自己的視圖引擎 Admin Area在這裏修改 27 ViewEngines.Engines.Add(new ThemeableRazorViewEngine()); 28 } 29 30 //Add some functionality on top of the default ModelMetadataProvider 使用nop的ModelMetadataProvider,處理NopResourceDisplayName,Html.NopLabelFor進行多語言顯示 31 ModelMetadataProviders.Current = new NopMetadataProvider(); 32 33 //Registering some regular mvc stuff 註冊MVC 物件(區域、路由) 34 AreaRegistration.RegisterAllAreas(); 35 RegisterRoutes(RouteTable.Routes); 36 37 //fluent validation 使用 fluent validation 進行模型驗證 38 DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 39 ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new NopValidatorFactory()));//Nop使用NopValidatorFactory進行進一步封裝,同時驗證類繼承BaseNopValidator,BaseNopValidator添加了對數據庫String最大長度及Decimal最大值的驗證 40 41 if (databaseInstalled) 42 { 43 //start scheduled tasks 44 TaskManager.Instance.Initialize();//初始化任務管理器 45 TaskManager.Instance.Start();//啟動任務管理器 46 47 //miniprofiler 使用miniprofiler進行性能分析 48 if (EngineContext.Current.Resolve<StoreInformationSettings>().DisplayMiniProfilerInPublicStore) 49 { 50 GlobalFilters.Filters.Add(new ProfilingActionFilter()); 51 } 52 53 //記錄日誌 54 try 55 { 56 //log 57 var logger = EngineContext.Current.Resolve<ILogger>(); 58 logger.Information("Application started", null, null); 59 } 60 catch (Exception) 61 { 62 //don‘t throw new exception if occurs 63 } 64 } 65 }
三.Application_BeginRequest做了什麽?
每次收到客戶端請求都會調用
1.過濾靜態資源 .css .gif .png 等
2.過濾keep alive請求(nop有個KeepAliveTask計劃任務定時調用keep alive鏈接請求,個人理解這個計劃任務是為了保持長鏈接,執行其他計劃任務的時候提高性能,理解不對的歡迎留言)
3.判斷數據庫是否存在,不存在則重定向安裝界面。(原理檢查“App_Data/Settings.txt”中鏈接字符串是否存在)
4.開啟miniprofiler 性能測試
四.Application_AuthenticateRequest
1.過濾靜態資源
2.過濾keep alive請求
3.設置”地區屬性” “語言屬性”,因為nop是支持多語言的,如果是進入管理界面(/admin)則設置為‘en-US‘,其他則為當前選擇的區域屬性
五.Application_EndRequest
1.停止miniprofiler 性能測試
六.Application_Error
1.獲取未處理的錯誤並記錄到日誌表中。(404不會記錄)
2.404錯誤會重定向到Common/PageNotFound進行處理。
總結
Application_Start 對nop應用進行了初始化,包括AutoFac、AutoMapper、Fluent validation、Miniprofiler這些框架的初始化,還有nop EngineContext、nop 視圖引擎、nop Model元數據提供者等nop封裝類的初始化。
nopCommerce 3.9 大波浪系列 之 global.asax