有好多朋友反馈看不懂我写的开源的一个练手项目(GitHub:https://github.com/AjuPrince/Aju.Carefree)也有好多人都但愿我能写一些简单的入门的文章,记得前几天在群里有人问为何 .Net Core 能跨平台,在聊天中发现也有好多人在已经在使用 .Net Core ,但问他们的时候他们也表示不知道,还有好多人说既然 .Net Core 能跨平台了为啥还在Window上须要IIS来部署呢?所以我想经过这篇文章来试着解释下。 (废话很少说,下面进入正题。)ios
在Asp.Net Core 以前,Asp.Net Framework 应用程序由IIS加载,Web应用程序的入口由InetMgr.exe建立并调用托管,在初始化过程当中触发HttpApplication.Application_Start()事件,咱们第一次执行代码的机会是处理Application_StartGlobal.asax中的事件,但在Asp.Net Core中,Global.asax文件找不见了,被新的初始化过程所替换(回到了熟悉的控制台应用程序)git
看上图的我圈住的地方,证实我没有吹牛皮。那就有好多人问了,既然是控制台应用程序,那为啥我没找见.exe 程序呢?github
以图来讲明,好像正的没有。很确定的说是真的没有。这是为何呢?(容我慢慢道来)json
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()方法cookie
一、那先来看看CreateDefaultBuilder 方法 app
从图中圈出来的注释来看,其实已经说的很明白了,我将试着解释下:使用预先配置的缺省值初始化WebHostBuilder类的新实例。(建议你们去看源码)搞懂这个东西就会理解 .Net Core 跨平台的秘密了,我简单的说下(算是给你们起个头,后面但愿你们都去看看源码(.Net Core 是开源的,在GitHub上能找到)),这里方法里其实初始化了一个Kestrel Web服务器(至于什么是Kestrel 服务器 后面有机会再介绍),在这个方法里默认使用系统配置文件 appsettings.json (注意,熟悉Asp.Net 的朋友们都知道有个Web.Config 配置文件,很差意思的说,在 .Net Core 中去掉了)等等。我以为最主要的就是这两个。函数
能够这么说是有了Kestrel Web服务器才使得.Net Core 能真正的跨平台。性能
从上图的代码中能够看到,初始化完了系统默认的配置以后,启动了Startup类,那么下面咱们就来看看这类ui
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 这两个方法
一、ConfigureServices
经过注释能够获得(此方法由运行时调用。使用此方法向容器添加服务。)并且能够看到这个方法0个引用,更加的说明一点注释是不会骗人的。
这个方法的做用就是向IServiceCollection 这个集合里添加服务,也就是说之后系统中想要什么服务(好比MVC、Session、Cookie。。。)都添加到这个集合中。在F12看看IServiceCollection这个集合
能够看到这个集合的命名空间,能够说明一点(DI在.NET Core里面被提到了一个很是重要的位置)
二、Configure 方法
经过注释(此方法由运行时调用。使用此方法配置HTTP请求管道。)能够了解到 这个异常之重要,此方法用于指定中间件以什么样的形式响应HTTP请求,网上文章都说的亲求处理管道(中间件)就是在这个方法里配置的。
借用网上的一张图来总结。
本篇文章只为了让你们入门,更深刻的东西后面有时间再深刻,若有不合适的地方请反馈,本人将立刻修改!
若是以为还不错,还请你们点个推荐(哈哈)!
https://github.com/dotnet/corefx(.Net Core 源码)
https://docs.microsoft.com/zh-cn/aspnet/core/release-notes/aspnetcore-2.2?view=aspnetcore-3.0(官方文档)