一.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封装类的初始化。