• 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

    WQM6XJ%`](IRCDLK_LC(7_G

    JF{P1B(J9U}[AS81S]4HY`B

    {V`LL`2_P$_JF$_6QNVUN0E

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


    本文地址:http://www.cnblogs.com/yaoshangjin/p/7217299.html 

    本文为大波浪原创、转载请注明出处。

    如果您认为这篇文章还不错或者有所收获,可以点击下方的【关注】按钮,因为你的支持是我继续写作,分享的最大动力!
    作者:大波浪
    声明: 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如果您发现博客中出现了错误,或者有更好的建议、想法,请及时与我联系!!如果想找我私下交流,可以私信或者加我QQ。
  • 相关阅读:
    Elastic-Job分布式任务调度
    java.sql.BatchUpdateException: ORA-01861: 文字与格式字符串不匹配
    oracle锁表和解锁
    sql ibatis
    唯一索引
    斐波那契数列
    旋转数组的最小数字
    两个栈来实现一个队列
    重建二叉树
    重写和重载
  • 原文地址:https://www.cnblogs.com/yaoshangjin/p/7217299.html
Copyright © 2020-2023  润新知