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

  640?wx_fmt=png

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

  640?wx_fmt=png

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

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 方法  

640?wx_fmt=png    

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

 640?wx_fmt=png

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

  这个方法的作用就是向IServiceCollection 这个集合里添加服务,也就是说以后系统中想要什么服务(比如MVC、Session、Cookie。。。)都添加到这个集合中。在F12看看IServiceCollection这个集合

  640?wx_fmt=png

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

    2、Configure 方法

  640?wx_fmt=png

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

5、总结

           640?wx_fmt=png

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

  • 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(官方文档)

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round #636 (Div. 3) D. Constant Palindrome Sum 思维 + 差分

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先有一个显然的性质就是每组操作最多不会超过两次。 很容易想到一个很暴力的思路&#xff0c;就是枚举x∈[1,2∗k]x \in [1,2*k]x∈[1,2∗k]&#xff0c;让后判断一下每组需要操作几次取…

C#8.0: 在 LINQ 中支持异步的 IAsyncEnumerableT接口

C# 8.0中&#xff0c;提供了一种新的IAsyncEnumerable<T>接口&#xff0c;在对集合进行迭代时&#xff0c;支持异步操作。比如在读取文本中的多行字符串时&#xff0c;如果读取每行字符串的时候使用同步方法&#xff0c;那么会导致线程堵塞。IAsyncEnumerable<T>可…

Codeforces Round #636 (Div. 3) E. Weights Distributing 思维 + bfs

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤2e5,m≤2e5n\le2e5,m\le2e5n≤2e5,m≤2e5 思路&#xff1a; 怎么感觉每场div3div3div3都有一个巧妙的图论题。 首先如果只有两个点的话&#xff0c;肯定是一次bfsbfsbfs之后取前disdisdis小的www作为边权…

解读 Microsoft.NET.Sdk 的源码,你能定制各种奇怪而富有创意的编译过程

在 csproj 中&#xff0c;Project 中的 Sdk 属性是 MSBuild 15.0 开始支持的&#xff0c;也就是 Visual Studio 2017 开始支持。有了 Sdk 属性的存在&#xff0c;MSBuild 编译过程能够扩展得非常强大&#xff0c;而不止是过去 Import 的一个 props 和 targets 文件。本文将介绍…

《ASP.NET Core 微服务实战》译者序

最近&#xff0c;我将《ASP.NET Core 微服务实战》一书由英文翻译为中文。这本书是由清华大学出版社引进的&#xff0c;目前还处于最后的排版校对过程中&#xff0c;现将该书的译者序发表于此。以下为译者译全文&#xff1a;“微服务”的概念在 2014 年正式提出之后&#xff0c…

.NET 云原生技术使用调查

.NET Core 3.0 即将发布RC&#xff0c;.NET Core 3.0默认更好的支持Docker资源限制&#xff0c;官方团队也在努力让.NET Core成为真正的容器运行时&#xff0c;使其在低内存环境中具有容器感知功能并高效运行。GC堆限制.NET Core减少了CoreCLR默认使用的内存&#xff0c;如G0代…

FZU - 2042 The Mad Mathematician 数位dp + 算贡献

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 求sumsumsum。 a,b,c,d,e≤1e18a,b,c,d,e\le1e18a,b,c,d,e≤1e18 思路&#xff1a; 这是一篇无从考究的题解&#xff0c;因为fzu现在进不去。 看到这种题直接考虑数位dpdpdp&#xff0c;对于[A,B],[C,D][…

「PowerBI」分析服务多维数据结构重回关系数据库的一大绝招

在过往Excel催化剂定位的轻量级ExcelPowerBIDesktop的解决方案中&#xff0c;已经做过了近乎完美的PowerBIDesktop数据模型数据导出到Excel工作表的应用&#xff0c;这也是个人版数据应用的重要的刚需功能&#xff0c;由Excel催化剂免费奉献给PowerBI社区作完结。此篇再次带领大…

Codeforces Round #257 (Div. 1) D. Jzzhu and Numbers 高维前缀和 + 容斥

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 完全想不到容斥啊&#xff0c;看了半天也没看懂渍渍渍。 定义f[i]f[i]f[i]表示iii的超集个数&#xff0c;那么选择的方案就是2f[i]−12^{f[i]}-12f[i]−1了&#xff0c;因为不能一个不选所…

花5分钟时间来了解一下高性能网关Kong会有意外收获

前言前几天开源发布了 Kong.Net 项目&#xff0c;收到了大量园友的反馈&#xff0c;开源当天就突破了 100 个star &#xff0c;可喜可贺&#xff0c;但是从侧面也说明&#xff0c;我们 .NetCore 阵营真的非常需要拥抱开源&#xff0c;应该敞开心扉&#xff0c;集众家之长&#…

长沙.NET技术社区·设计到实现

方案最终夭折回到一年前的四月初&#xff0c;也是这样一个气象更新&#xff0c;春意盎然的一年中最好的时光。 在长沙.NET技术圈中&#xff0c;有一个不知名的QQ群&#xff0c;叫做放肆.NET技术交流群&#xff08;群号&#xff1a;44329330&#xff09;&#xff0c;在这个群里面…

Loj #6274. 数字 数位dp + 去重

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 考虑数位dpdpdp&#xff0c;设计状态f[pos][flag1][flag2][flag3][flag4]f[pos][flag1][flag2][flag3][flag4]f[pos][flag1][flag2][flag3][flag4]&#xff0c;其中flag1:x≥Lxflag2:y≤Rx…

微软发布 VS Code 容器化开发工具,大大简化物联网设备开发

近日&#xff08;北京时间 2019 年 7 月 9 日&#xff09;&#xff0c;微软宣布了 Azure IoT Tools for VS Code 的全新功能&#xff1a;通过在容器中封装编译器、设备 SDK 以及基本库&#xff0c;大大简化了设备交叉编译的工作量&#xff0c;使得嵌入式 Linux 设备&#xff08…

Codeforces Round #636 (Div. 3) F. Restore the Permutation by Sorted Segments 思维 + 暴力

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n≤200n\le200n≤200 思路&#xff1a; 首先关注到rrr从[2,n][2,n][2,n]都出现一次&#xff0c;所以很明显最后一个位置只出现一次&#xff0c;但是这样倒着来不是很好做考虑正着来。 我们可以枚举111位置填…

.NET中生成动态验证码

NET中生成动态验证码验证码是图片上写上几个字&#xff0c;然后对这几个字做特殊处理&#xff0c;如扭曲、旋转、修改文字位置&#xff0c;然后加入一些线条&#xff0c;或加入一些特殊效果&#xff0c;使这些在人类能正常识别的同时&#xff0c;机器却很难识别出来&#xff0c…

Codeforces Beta Round #51 D. Beautiful numbers 数位dp + 状态优化

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 数位dpdpdp挺经典的一个题辣&#xff0c;有一个很明显的状态就是f[pos][num][lcm]f[pos][num][lcm]f[pos][num][lcm]表示到了第pospospos位&#xff0c;数是numnumnum&#xff0c;个位数最…

在C#中使用Irony实现SQL语句的解析

在上一篇博文 LogoSharp&#xff1a;Logo语言的C#实现中&#xff0c;我介绍了LOGO语言的C#实现&#xff0c;在该项目中&#xff0c;我使用了.NET下的语法解析框架&#xff1a;Irony。Irony框架最开始的时候是由Roman Ivantsov发布在codeplex上的一个开源项目&#xff0c;它使用…

P4127 [AHOI2009]同类分布 数位dp + 对状态剪枝

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 比较套路的题&#xff0c;首先也有个明显的状态f[pos][num][sum]f[pos][num][sum]f[pos][num][sum]表示到了pospospos位&#xff0c;当前数为numnumnum&#xff0c;各位数字之和为sumsumsu…

.NET开发框架(六)-架构设计之IIS负载均衡(视频)

前面有关注我们公众号文章的朋友应该都知道&#xff0c;我们的分布式应用服务可以通过Ocelot网关进行负载均衡&#xff0c;这种方式属于应用级别的实现。而今天我们给大家介绍的是平台级别的实现&#xff0c;并且我们首次使用视频方式进行讲解。本文通过视频方式为大家演示&…

架构杂谈《二》

服务化到微服务1、微服务的产生随着互联网企业的不断发展&#xff0c;海量用户发起的大规模、高并发请求是企业不得不面对的&#xff0c;上一篇 架构杂谈《一》杂谈的SOA服务化系统能够分解任务&#xff0c;让每个服务更简单、职责单一、更易于扩展。但无论是Web Service 还是E…