1. 程式人生 > >nopCommerce 3.9 大波浪系列 之 global.asax

nopCommerce 3.9 大波浪系列 之 global.asax

ring ntc 開發 idt disable pre ren ins 未處理

一.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>
2 /// 1. 3 /// 不是每次請求都調用 4 /// 在Web應用程序的生命周期裏就執行一次 5 /// 在應用程序第一次啟動和應用程序域創建事被調用 6 /// 適合處理應用程序範圍的初始化代碼 7 /// </summary> 8 protected void Application_Start() 9 { 10 //指定傳輸層安全 (TLS) 1.2 安全協議 11 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 12
13 //隱藏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 }
protected void Application_Start()

三.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