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获得下一个中间件 其实我们想一下 这不就是链表吗 委托就是函数指针 链表里面的元素就是方法 不过都是用指针来处理的而已

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

.netcore基础知识(一)相关推荐

  1. 嵌入式Linux的OTA更新,基础知识和实现

    嵌入式Linux的OTA更新,基础知识和实现 OTA updates for Embedded Linux, Fundamentals and implementation 更新的需要 一旦嵌入式Li ...

  2. 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记

    计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...

  3. 嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...

    注:所有内容基于友善之臂Mini2440开发板 一.嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1.编译bootloader,烧到开发板 2.编译嵌入式Linux内核,烧到开发板 3 ...

  4. 《计算机网络应用基础》模拟试卷(六),《计算机与网络应用基础知识1》模拟试卷...

    <计算机与网络应用基础知识1>模拟试卷 (4页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 <计算机与网络应用基础知识1& ...

  5. python向量计算库教程_NumPy库入门教程:基础知识总结

    原标题:NumPy库入门教程:基础知识总结 视学算法 | 作者 知乎专栏 | 来源 numpy可以说是 Python运用于人工智能和科学计算的一个重要基础,近段时间恰好学习了numpy,pandas, ...

  6. python常用变量名_python基础知识整理

    Python Python开发 Python语言 python基础知识整理 序言:本文简单介绍python基础知识的一些重要知识点,用于总结复习,每个知识点的具体用法会在后面的博客中一一补充程序: 一 ...

  7. 计算机基础知识掌握欠缺,《计算机基础知识》实验教学改革探讨.pdf

    <计算机基础知识>实验教学改革探讨.pdf Science& TechnologyVision 科 技 视 界 科技 探·索·争鸣 计<算机基础知识>实验教学改革探讨 ...

  8. python计算wav的语谱图_Python实现电脑录音(含音频基础知识讲解)

    前言 今天开始进入近期系列文章的第一篇,如何用 Python 来实现录音功能. 在开始"造轮子"之前,个人一直强调一个观点,如果有些东西已经有了,不妨直接去 github 上搜,用 ...

  9. 计算机wrod初级考试题及答案,计算机基础知识+Word基础知识+Excel基础知识试题答案解析.doc...

    文档介绍: 计算机基础知识+ Word基础知识+ Excel基础知识 第一部分 一.单项选择题 1.世界上第一台电子数字计算机取名为(    ). A.UNIVAC    B.EDSAC    C.E ...

最新文章

  1. 服务器收到消息怎么推送给app_「刹那问答24」浅谈FCM推送
  2. Windows10下安装unbuntu双系统 以及花屏解决办法
  3. python抓取网页图片的小案例
  4. python class 初始化顺序
  5. zz 递归算法转换为非递归算法
  6. Linux下的硬链接和软链接
  7. ECshop商城程序常见的96个小问题汇总
  8. react的bind(this)
  9. 每日一linux命令
  10. Angular form学习笔记
  11. asp.net发送邮件
  12. Eclipse中执行Ant脚本出现Could not find the main class的问题及解
  13. echart 地图 某个地区_「省份」Echart系列 | 绘制世界地图含中国各个省份(地图篇)(一) - seo实验室...
  14. 小米球(Ngrok)实现内网穿透,让外网可以进行访问本地部署的 API
  15. 集成电路技术与产业发展
  16. 【Opencv综合应用】自制训练集的人脸识别1——拍摄10张人脸图片
  17. Property 'driverClassName' threw exception; nested exception is java.lang.IllegalStateException: Cou
  18. 华为鸿蒙朱丹丹,周一围心疼老婆?朱丹二胎产后憔悴臃肿却忙复出:这一年太痛苦...
  19. 蒙特卡罗模拟赌徒人生
  20. 医院HIS系统运维工作见闻

热门文章

  1. 【动态规划】CH_0103 最短Hamilton路径
  2. C语言实现扫雷完整算法详解~(附完整代码~)
  3. 语句摘抄——第16周
  4. CSP化学方程式题解
  5. css3八卦,CSS3 阴阳八卦(太极)图动画
  6. 计算机菜单命令,什么是电脑的菜单操作命令
  7. html div 移除,js动态创建及移除div的方法
  8. 第一回 网管是个苦差事
  9. 协方差矩阵、大数定律、牛顿迭代法
  10. 浅谈网站的logo设计