.netcore基础知识(一)

Python微信订餐小程序课程视频

https://edu.csdn.net/course/detail/36074

Python实战量化交易理财系统

https://edu.csdn.net/course/detail/35475

先来说说web服务器

先来一张图 一个典型的进程外托管模型 我们先看kestrel这一部分 我们在它前面放了一个方向代理服务器nginx 对http请求做预处理 kestrel本身是可以直接用作web服务器的 但是其功能较弱 只有基础功能 说白了就是一个弱化版的IIS 所以不建议直接将他暴露出来 一般会在前面加上一个反向代理服务器 当然图中也可以将IIS作为反向代理服务器 但是这有点多此一举了 我们可以直接用IIS 这时有IIS集成技术 会消耗更少资源 这时叫做进程内托管 所以其实一共就有两种最优方案:

(1)确定要用IIS情况下 直接用IIS集成 进程内托管

(2)不确定要用IIS 建议Nginx/apache + Kestrel 这样外部有一层反向代理 能有效做负载均衡,动静分离,访问控制,重定向等等 kestrel仅仅用来处理http请求

然后来讲讲Host主机

Program类就是用来创建主机的

    public class Program{public static void Main(string[] args){CreateHostBuilder(args).Build().Run();}public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup();});}

看一下这段代码 是不是很眼熟? Core的main方法就在这里 这是程序的入口 我们看一下他做了什么

CreateHostBuilder(args).Build().Run(); 

上面这句就是:创建主机生成器 ----> 配置主机 ----> 创建主机 ----> 运行主机底下那个方法是前两步 从 .Build().Run() 这两步就是后面两步主机有啥用? 微软官方的说法是 ---- 主机负责应用程序启动和生存期管理 说白了就是启动程序和程序的生命周期的管理 主要用于配置服务器和请求处理管道。 主机还可以设置日志记录、依赖关系注入和配置 就是一系列配置都是主机来做的

最后来讲一下最重要的管道和中间件

    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.AddControllers();}// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}}

看一下这段代码 我们先看第一个方法 ConfigureServices 这个方法其实很多人都用过 它是用来配置IOC容器 因为Core最核心的点就在于我们要遵循依赖注入的原则 举个例子 我们想要吃一个苹果 我们要怎么做 当然是去商店买一个 而不是我们自己造一个 为啥呢?因为我们没有造苹果的图纸啊 也就是说 我们想要造一个苹果 首先我们需要一个造苹果的图纸 这样其实我们就和苹果类联系在一起了 这个图纸 在程序里就叫做构造方法 而例子里面的商店 其实就是IOC容器 我们想要苹果就去商店买 我们不关心苹果是怎么造出来的 都是商店来处理 我们就和苹果解耦了 这就是非常典型的DI(依赖注入)思想 IOC容器其实就是反转控制容器 帮我们造实例的容器 我们要的话直接找它拿就好了 我们就不用去 new() 对象了

话说回来 ConfigureServices 方法其实作用就是将我们这些“苹果”进行注册 说白了就是我们要给IOC容器提供构造方法吧 否则IOC容器也不知道怎么生产苹果 那怎么注册呢 请看下图:

            services.AddSingleton();services.AddTransient();services.AddScoped();

可以看出来 后面两个泛型参数第一个是实现类的接口 第二个是实现类 一共是三种方法进行注册 我们要怎么区分这三种方法呢?

(1)AddSingleton() 这个表示单例 首次请求会创建这个服务实例 应用程序生命周期中从头到尾只有这一个实例存在

(2)services.AddTransient() 这个表示瞬时 每次请求或用到这个实例 全部都是重新创建的

(3)services.AddScoped() 这个表示在同一个http请求中 或者说同一个线程中 这个实例只会被创建一次 举个例子 A依赖B 请求进来了 A在方法里多次使用了B 那这个B的实例 都是同一个 加入下一次请求来了 那么就不是同一个了

多提一句 系统本来就注册好的服务是已经设定好生命周期的 假如我们要自定义服务 我们要给它设定生命周期 注意 若同一个服务接口我们多次注册 后面会覆盖前面注册的

我们再来看第二个方法Configure 这个方法其实就是用来构建管道 增加中间件的

IApplicationBuilder 其实就是一个管道构建器 我们看到下面的方法不断在app.UseXXX() 其实这都是扩展方法 其实都是在添加中间件 http请求进来 所有的一切 都是中间件 不论是什么控制器 服务类 路由 身份验证… 全部都是中间件 中间件之间的关系是怎么样的 执行顺序是怎么样的 这是一个难点 首先说执行顺序 实际上中间件是从第一个开始 执行到最后一个 然后从最后一个一直到第一个进行返回 中间件原则是:1.能将请求传递给下一个中间件 2.能够进行响应,使管道短路  短路是非常有必要的 没有短路就没有返回了 假如我们没有设置在最后的短路中间件 系统会有一个报错的最后中间件 强制短路返回

执行顺序很有意思 先看我们自己写的自定义中间件:

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.Use(async (context, next) =>{await context.Response.WriteAsync("First Begin \r\n ");await next();await context.Response.WriteAsync("First End \r\n ");});app.Use(async (context, next) =>{await context.Response.WriteAsync("Second Begin \r\n ");await next();await context.Response.WriteAsync("Second End \r\n ");});app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapGet("/", async context =>{await context.Response.WriteAsync("Hello World! \r\n");});});}

可以看到我们写了两个自定义中间件 我们直接运行 看看他们执行顺序是咋样的:

是不是很有意思!我们现在就能理解了 next()实际上就是一个去找下一个中间件的委托 或者说next其实就是下一个中间件 先按照顺序执行第一个中间件 然后next去找下一个中间件 第二个中间件的begin执行 然后执行next 找到下面的helloworld 这时候没有下一个输出了 这时候就返回了 从helloworld 到第二个中间件里面的代码 就到了第二个的end 然后返回到第一个中间件 就到了第一个的end 就是这样一个顺序

而且我们也可以自己写中间件 就像我图上所示 app.Use() 方法 一共两个参数

        public static IApplicationBuilder Use(this IApplicationBuilder app, Func, Task> middleware){throw null;}

第一个那个this是拓展方法用的 是一种方便用的简写 从第二个参数开始 我们看到实际上这个参数是一个委托 这个委托也有两个参数 第一个是Http的上下文对象 第二个参数是一个Task型委托 其实就是我们的next 返回值也是一个Task 表明它指向的是一个异步方法

说白了 两个参数其实就是 (context, next) 整体是异步的 所以前面要加 async 方法体里面调用的时候要用await  因为next本身是异步方法

实际上在Core底层 next指向的就是下一个方法 委托其实就是一个函数指针 整体的处理是 先用一个List将所有中间件倒序放入 然后挨个取出 然后把反序第一个 也就是原先最后一个中间件当参数传递给前一个中间件的next 所以就能串起来 执行的时候第一个便可以根据next获得下一个中间件 其实我们想一下 这不就是链表吗 委托就是函数指针 链表里面的元素就是方法 不过都是用指针来处理的而已

最后还要提一点 要是我们写自定义中间件 要用扩展方法 这是约定原则

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

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

相关文章

内存墙,多核CPU的终结者?

原文地址:http://www.ed-china.com/ART_8800045174_400004_500008_OT_8f4eb612.HTM 多核处理器是当今计算领域的主导,而多核芯片则遍布从苹果的iPad到富士通K超级计算机的各种平台。2005年,由于功耗将单核CPU的时钟速度限制在3GHz&#xff0c…

BZOJ 1791 岛屿(环套树+单调队列DP)

题目实际上是求环套树森林中每个环套树的直径。 对于环套树的直径,可以先找到这个环套树上面的环。然后把环上的每一点都到达的外向树上的最远距离作为这个点的权值。 那么直径一定就是从环上的某个点开始,某个点结束的。 把环拆成链,定义dp[…

什么是SAS

什么是SAS?简单的说,SAS是一种磁盘连接技术。它综合了现有并行SCSI和串行连接技术(光纤通道、SSA、IEEE1394及InfiniBand等)的优势,以串行通讯为协议基础架构,采用SCSI-3扩展指令集并兼容SATA设备&#xff…

C语言编程规范--常用缩写词

常用缩写词 缩 写 全 称 a addr address admin / adm administrator app application arg argument asm assemble asyn asynchronization avg average b bg background bk back bmp bitmap brk break btn button buf buffer c calc calculate ch…

netty系列之:JVM中的Reference count原来netty中也有

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 目录* 简介 ByteBuf和ReferenceCountedByteBuf的基本使用ByteBuf的回收ByteBuf的衍生方法ChannelHandler中的引用计数内存泄…

hdu区域赛在线热身赛 暨 第十二场组队赛

题目编号:hdu 4257~4266 (对应比赛题号1001~1010) 这是我们第十二场组队赛,在今天中午进行。 比赛刚开始,依然是由我的队友读题。还没看几题,就发现了好多题judge时长高达20秒,这真的有点给我们心理造成压力。不过&…

powerdesign相关

1.安装程序和汉化放百度云了 2.打印错误处理 http://jingyan.baidu.com/article/c45ad29cd84e4b051753e2c3.html 3.导出sql http://jingyan.baidu.com/article/7082dc1c48960ee40a89bd38.html 4.name和comment同步 http://blog.csdn.net/steveguoshao/article/details/16940347…

游戏名词

BUFF,DEBUFF: 增益状态,包括自己或者队友施加的,例如骑士的祝福,牧师的耐力精神,小德的爪子DEBUFF就是减益状态,例如你PK的时候法师的寒冰箭减速,盗贼的毒药,SS的腐蚀等等NPC: NPC就…

C语言编程规范--代码注释

目录 1、什么是Doxygen?. 3 2、撰写正确格式的批注... 4 2.1常用指令介绍... 4 2.2简述与详述的方式... 6 2.3文件头注释... 6 2.4版权注释... 6 2.5模块定义(单独显示一页)... 7 2.6分组定义(在一页内分组显示)... 8 2.7变量、宏…

Spring系列15:Environment抽象

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 本文内容 Environment抽象的2个重要概念Profile 的使用PropertySource 的使用 Environment抽象的2个重要概念 Environme…

U-Mail邮件服务系统任意文件上传+执行漏洞(runtime缺陷与验证绕过)

http://www.wooyun.org/bugs/wooyun-2010-061859转载于:https://www.cnblogs.com/hookjoy/p/4068326.html

Source Insight使用技巧

一、Source Insight实用技巧: Source Insight(下文的SI指的也是它)就是这样的一个东西:   Windows下开发人员的至爱,功能强大,界面友好。支持语法高亮、符号跳转,还支持函数调用关系图显示。这是一个专业的编程环境&…

剑指offer-翻转单词顺序列

剑指offer-翻转单词顺序列 题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a …

私有化轻量级持续集成部署方案--05-持续部署服务-Drone(上)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 提示:本系列笔记全部存在于 Github, 可以直接在 Github 查看全部笔记 持续部署概述 持续部署是能…

PS图像菜单下计算命令

PS图像菜单下计算命令通过通道的混合模式得到的选区非常精细,从而调色的时候过度非常好。功能十分强大。 下面用计算命令中的"相加"和"减去"模式做实例解析,这里通道混合模式和图层混合模式原理是一样的。 原图: 实例目…

LINQ系列:LINQ to XML操作

LINQ to XML操作XML文件的方法,如创建XML文件、添加新的元素到XML文件中、修改XML文件中的元素、删除XML文件中的元素等。 1. 创建XML文件 string xmlFilePath Server.MapPath("Data/Product.xml");XDocument doc new XDocument (new XDeclaration(&quo…

C语言编程规范

C语言编程规范 范 围: 本规范适用于公司内使用C语言编码的所有软件。本规范自发布之日起生效,以后新编写的和修改的 代码应遵守本规范。 简 介: 本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效 率、可移…

Ubuntu开发之旅一---安装初步

由于有一台小黑,老机器了,闲置时间不长不短,偶尔拿来用下,总感觉windows跑起来太费力,鉴于有过一段时间的Linux开发经验(大概四个月左右),故抽空安装了一个ubuntu,原因有…

win10 VScode配置GCC(MinGW)

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 前提 安装 Visual Studio Code安装 C/C 扩展 for VS Code 也可以在vscode的extension界面搜索’c’查找插件安装 3. 获取最…

复制构造函数的用法及出现迷途指针问题

复制构造函数利用下面这行语句来复制一个对象: A (A &a) 从上面这句话可以看出,所有的复制构造函数均只有一个参数,及对同一个类的对象的引用 比如说我们有一个类A,定义如下: ?12345678910class A{public:A(int i…