小白开学Asp.Net Core 《六》
小白开学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文件找不见了,被新的初始化过程所替换(回到了熟悉的控制台应用程序)

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

以图来说明,好像正的没有。很肯定的说是真的没有。这是为什么呢?(容我慢慢道来)
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 方法

从图中圈出来的注释来看,其实已经说的很明白了,我将试着解释下:使用预先配置的缺省值初始化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

通过注释可以得到(此方法由运行时调用。使用此方法向容器添加服务。)而且可以看到这个方法0个引用,更加的说明一点注释是不会骗人的。
这个方法的作用就是向IServiceCollection 这个集合里添加服务,也就是说以后系统中想要什么服务(比如MVC、Session、Cookie。。。)都添加到这个集合中。在F12看看IServiceCollection这个集合

可以看到这个集合的命名空间,可以说明一点(DI在.NET Core里面被提到了一个非常重要的位置)
2、Configure 方法

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

借用网上的一张图来总结。
- ASP.NET Core在运行时首先加载Program类下面的Main方法,在Main方法中指定托管服务器,并调用Startup类中的Configure和ConfigureServices方法等完成初始化
- 在ASP.NET Core中 HTTP请求是以中间件管道的形式进行处理
- .Net Core 应用程序不需要用IIS进行托管,所以相比传统Asp.Net来说性能更高效也更加灵活
- .Net Core 跨平台在于维护了自己的内部Web服务器(Kestrel )
本篇文章只为了让大家入门,更深入的东西后面有时间再深入,如有不合适的地方请反馈,本人将马上修改!
如果觉得还不错,还请大家点个推荐(哈哈)!
资料:
https://github.com/dotnet/corefx(.Net Core 源码)
https://docs.microsoft.com/zh-cn/aspnet/core/release-notes/aspnetcore-2.2?view=aspnetcore-3.0(官方文档)

小白开学Asp.Net Core 《六》的更多相关文章
- 小白开学Asp.Net Core 《九》
小白开学Asp.Net Core <九> — — 前端篇(不务正业) 在<小白开学Asp.Net Core 三>中使用了X-admin 2.x 和 Layui将管理后端的界面重 ...
- 小白开学Asp.Net Core 《四》
小白开学Asp.Net Core<三> —— 使用AspectCore-Framework 一.AspectCore-Frame ...
- 小白开学Asp.Net Core 《五》
小白开学Asp.Net Core<五> —— 使用.Net Core MVC Filter 一.简介 今天在项目(https:/ ...
- 小白开学Asp.Net Core 《七》
小白开学Asp.Net Core <七> — — 探究中间件(MiddleWare) 1.何为中间件? 中间件是组装到应用程序管道中以处理请求和响应的家伙,管道中的每个组件都要满足以下两个 ...
- 小白开学Asp.Net Core《三》
小白开学Asp.Net Core<三> ——界面 我胡汉三再次又回来了(距离上篇时间有点长),今天抽时间将最近对框架采用的后台界面做个记录 1.先上图 (图一) (图二) 2.界面说明 后 ...
- 小白开学Asp.Net Core《二》(补)
小白开学Asp.Net Core<二>(补) ——数据仓储层(Repositroy).服务层(Service) -------------------------------------- ...
- 小白开学Asp.Net Core《二》
小白开学Asp.Net Core<二> ——数据仓储层(Repositroy) 一.历史现象 在后端开发中,数据库操作是最频繁的,每一个开发人员都会接触,甚至不少开发人员每天的工作就是与数 ...
- 小白开学Asp.Net Core 《十》
小白开学Asp.Net Core <十> — — Session.Cookie.Cache(老生常谈) 一.背景 在常谈Session和Cookie之前我们先来简单的了解下Http(可以说 ...
- 小白开学Asp.Net Core 《八》
小白开学Asp.Net Core <八> — — .Net Core 数据保护组件 1.背景 我在搞(https://github.com/AjuPrince/Aju.Carefree)这 ...
随机推荐
- Matlab随笔之画图函数总结
原文:Matlab随笔之画图函数总结 MATLAB函数画图 MATLAB不但擅长於矩阵相关的数值运算,也适合用在各种科学目视表示(Scientific visualization).本节将介绍MATL ...
- WPF图片放大后模糊的解决方法
原文:WPF图片放大后模糊的解决方法 WPF中显示图片的方式很多,可以用Image控件来显示图像,或者直接设置一个控件的Background.图片的放大也很简单,直接设置显示图片的控件的Width和H ...
- Java数据存储机制的实现
原文地址:http://yanwushu.sinaapp.com/java_data_storage/ Java程序在执行时须要为一系列的值或者对象分配内存,这些值都存在什么地方?用什么样的数据结构存 ...
- Wrapped的返回值取值
Bared Wrapped using Newtonsoft.Json; using Newtonsoft.Json.Linq; string str = JsonConvert.Serial ...
- IOS开发之KVC KVO KVB
KVC(Key Value Coding) KVO(Key Value Observing) KVB(Key Value Binding) KVO是Cocoa的一个重要机制,他提供了观察某一属性变化的 ...
- SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction 解决方法
SHOW FULL PROCESSLIST; KILL 263071
- .NET VS 自定义新建代码文件模板
参考:http://www.cnblogs.com/fightingtong/p/3765914.html 在VS中新建文件时,可使用模板在文件中生成指定内容.只需要把IDE安装目录下的模板进行修改保 ...
- Win10如何设置开机自动登录
原文:Win10如何设置开机自动登录 第一步: 小娜搜索"netplwiz",进入用户账户设置. 第二步: 先勾选选中一次,要使用本计算机,用户必须输入用户名和密码. 第三步: 取 ...
- QString转换为LPTSTR(使用了reinterpret_cast,真是叹为观止,但是也开阔了思路),三篇文章合起来的各种转换方法
醉了,windows下宏定义了很多char类型 LPTSTR .今天,直接使用,qt报错,真TM费事. 将“CPU”转化为wcha_t * QString str = "CPU"; ...
- python chrome selenium
#coding=utf-8 from selenium import webdriver options = webdriver.ChromeOptions() options.add_argumen ...