欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

小白开学Asp.Net Core 《六》

程序员文章站 2022-04-09 16:06:42
小白开学Asp.Net Core 《六》 —— 探究.Net Core 跨平台的奥秘 1、写这篇文章的初衷 有好多朋友反馈看不懂我写的开源的一个练手项目(GitHub:https://github.com/AjuPrince/Aju.Carefree)也有好多人都希望我能写一些简单的入门的文章,记得 ......

小白开学asp.net core 《六》

                                                    —— 探究.net core 跨平台的奥秘

1、写这篇文章的初衷

  有好多朋友反馈看不懂我写的开源的一个练手项目(github:https://github.com/ajuprince/aju.carefree)也有好多人都希望我能写一些简单的入门的文章,记得前几天在群里有人问为什么 .net core 能跨平台,在聊天中发现也有好多人在已经在使用 .net core ,但问他们的时候他们也表示不知道,还有好多人说既然 .net core 能跨平台了为啥还在window上需要iis来部署呢?因此我想通过这篇文章来试着解释下。 (废话不多说,下面进入正题。)

2、概述

  在asp.net core 之前,asp.net framework 应用程序由iis加载,web应用程序的入口由inetmgr.exe创建并调用托管,在初始化过程中触发httpapplication.application_start()事件,我们第一次执行代码的机会是处理application_startglobal.asax中的事件,但在asp.net core中,global.asax文件找不见了,被新的初始化过程所替换(回到了熟悉的控制台应用程序)

  小白开学Asp.Net Core 《六》

  看上图的我圈住的地方,证明我没有吹牛皮。那就有好多人问了,既然是控制台应用程序,那为啥我没找见.exe 程序呢?

  小白开学Asp.Net Core 《六》

  以图来说明,好像正的没有。很肯定的说是真的没有。这是为什么呢?(容我慢慢道来)

3、program.cs 

public class program
    {
        public static void main(string[] args)
        {
            createwebhostbuilder(args).build().run();
        }

        public static iwebhostbuilder createwebhostbuilder(string[] args) =>
            webhost.createdefaultbuilder(args)
                .usestartup<startup>();
    }

  既然通过上面我们知道了.net core 应用程序是控制台应用程序,那么我们就很熟悉了,代码启动后肯定会找main()函数(方法)(其实这就是asp.net core应用程序开发的根本变化),所有的asp.net托管库都是从program开始执行。

  下面我们来解析下main->createwebhostbuilder()方法

  1、那先来看看createdefaultbuilder 方法  

   小白开学Asp.Net Core 《六》

   从图中圈出来的注释来看,其实已经说的很明白了,我将试着解释下:使用预先配置的缺省值初始化webhostbuilder类的新实例。(建议大家去看源码)搞懂这个东西就会理解 .net core 跨平台的秘密了,我简单的说下(算是给大家起个头,后面希望大家都去看看源码(.net core 是开源的,在github上能找到)),这里方法里其实初始化了一个kestrel web服务器(至于什么是kestrel 服务器 后面有机会再介绍),在这个方法里默认使用系统配置文件 appsettings.json (注意,熟悉asp.net 的朋友们都知道有个web.config 配置文件,不好意思的说,在 .net core 中去掉了)等等。我觉得最主要的就是这两个。

  可以这么说是有了kestrel web服务器才使得.net core 能真正的跨平台。

       从上图的代码中可以看到,初始化完了系统默认的配置之后,启动了startup类,那么下面我们就来看看这类

4、startup 类 

 public class startup
    {
        public startup(iconfiguration configuration)
        {
            configuration = configuration;
        }

        public iconfiguration configuration { get; }

        // this method gets called by the runtime. use this method to add services to the container.
        public void configureservices(iservicecollection services)
        {
            services.configure<cookiepolicyoptions>(options =>
            {
                // this lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.checkconsentneeded = context => true;
                options.minimumsamesitepolicy = samesitemode.none;
            });


            services.addmvc().setcompatibilityversion(compatibilityversion.version_2_2);
        }

        // this method gets called by the runtime. use this method to configure the http request pipeline.
        public void configure(iapplicationbuilder app, ihostingenvironment env)
        {
            if (env.isdevelopment())
            {
                app.usedeveloperexceptionpage();
            }
            else
            {
                app.useexceptionhandler("/error");
                // the default hsts value is 30 days. you may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.usehsts();
            }

            app.usehttpsredirection();
            app.usestaticfiles();
            app.usecookiepolicy();

            app.usemvc();
        }
    }

  这是一个干净的(新建的web程序)

  从头来看,我们发现了一个很熟悉的方法——>构造函数,再仔细一看(原来是构造函数注入,这里就不在说ioc了,默认大家都知道。)

    接下来看看configureservices和configure 这两个方法

  1、configureservices

  小白开学Asp.Net Core 《六》

  通过注释可以得到(此方法由运行时调用。使用此方法向容器添加服务。)而且可以看到这个方法0个引用,更加的说明一点注释是不会骗人的。

  这个方法的作用就是向iservicecollection 这个集合里添加服务,也就是说以后系统中想要什么服务(比如mvc、session、cookie。。。)都添加到这个集合中。在f12看看iservicecollection这个集合

  小白开学Asp.Net Core 《六》

  可以看到这个集合的命名空间,可以说明一点(di在.net core里面被提到了一个非常重要的位置)

    2、configure 方法

  小白开学Asp.Net Core 《六》

  通过注释(此方法由运行时调用。使用此方法配置http请求管道。)可以了解到 这个异常之重要,此方法用于指定中间件以什么样的形式响应http请求,网上文章都说的亲求处理管道(中间件)就是在这个方法里配置的。

5、总结

           小白开学Asp.Net Core 《六》

  借用网上的一张图来总结。

  • asp.net core在运行时首先加载program类下面的main方法,在main方法中指定托管服务器,并调用startup类中的configure和configureservices方法等完成初始化
  • 在asp.net core中 http请求是以中间件管道的形式进行处理
  • .net core 应用程序不需要用iis进行托管,所以相比传统asp.net来说性能更高效也更加灵活
  • .net core 跨平台在于维护了自己的内部web服务器(kestrel )

    本篇文章只为了让大家入门,更深入的东西后面有时间再深入,如有不合适的地方请反馈,本人将马上修改!

  如果觉得还不错,还请大家点个推荐(哈哈)!

 资料:

 (.net core 源码)

(官方文档)

 

小白开学Asp.Net Core 《六》