C# .NetCore学习总结-程序员宅基地

技术标签: c#  .netcore  .net  

目录

LTS

IIS如何托管.NetCore的项目

什么是.NetCore

Hosting

Kestrel

中间件

是什么

自定义中间件

注册模式

Run方式

Use方式

中间件实现原理

应用场景

异常处理

防盗链

中间件/IIS

referer真的能防盗链?

ConfigureServices/Configure

ConfigureServices

Configure

HttpClientFactory

LTS

长期维护的版本。

IIS如何托管.NetCore的项目

  1. IIS在托管.NetCore的项目时,需要先将.NetCore的项目发布。
  2. 然后在IIS中需要安装 Asp.NetCoreModuleV2。

什么是.NetCore

  1. .NetCore是一个服务。
  2. 这个服务会启动了一个网络监听器,并且这个监听器需要长时间的运行。
  3. 一旦这个监听器接收到一个HTTP的请求以后,就会将HTTP的请求传递给应用的管道进行处理。
  4. 当完成处理后就会产生HTTP请求的响应,并且通过这个监听器返回给客户端。

Hosting

  1. 这个长时间运行的服务需要寄宿在托管进程里面。
  2. 提供了这个功能的组件就是Hosting。
  3. 像这种寄宿在托管进程里面由Hosting长时间管理的服务,就是托管服务。
  4. 所以.NetCore的应用就是一个寄宿在Hosting上面的一个托管服务。
  5. 任何需要在后台长时间运行的程序,都可以按照一定的标准把它定义成一个服务然后寄宿在Hosting 上面。
  6. 创建一个托管服务实际上就是一个实现了IHostedServce接口的类。

Kestrel

  1. 但是对于HTTP请求的处理必须要有一个服务器,来接收HTTP的请求,这个服务器就是Kestrel。
  2. 当Web服务器启动以后,配置的HTTP请求管道才会被构建出来。
  3. 这个管道就会被绑定到Kestrel默认的端口上面,默认的端口号是5000,并且开始监听HTTP的请求。
  4. 当HTTP的请求一旦到达Kestrel服务器,就会将其标准化为一个HTTP的上下文对象。
  5. 也就是HttpContext对象,然后再把HttpContext对象发送给管道。
  6. 处理HTTP请求的是配置在管道中的各个组件,这个组件就是管道中间件。
  7. 所以管道就是由一个服务器和一组中间件构成。
  8. 也可以把管道理解为HTTP的请求被处理的步骤。

中间件

是什么

  1. Kestrel负责HTTP请求的监听,接收,分发和最终的响应。
  2. 对于HTTP请求的处理就是根据中间件来完成的。
  3. 中间件实际上是个Func委托,Func委托的入参是RequestDelegate,返回值也是RequestDeleagate。
  4. RequestDeleagate也是个委托,是用delegate直接声明的委托,返回的类型是Task,入参是HttpContext。
  5. 所以RequestDeleagate就表示了HTTP请求的处理器,中间件就是借助了RequestDeleagate将HTTP的 请求往后传递。
  6. 所以管道也可以理解为由委托组成的一条双向责任链,形成了一个闭环。

自定义中间件

app.UseMiddleware<TMiddleware>()

注册模式

Run方式

  1. 通过Run的方式进行注册,只是对HttpContext对象进行处理,并没有去执行RequestDelegate委托。
  2. 所以一般作为HTTP请求的终结点,也就是不在执行下一个中间件。

Use方式

  1. 通过Use的方式进行注册,一般不把它作为HTTP请求的终结点。
  2. 在对HttpContext对象进行处理完成之后,可以执行传入的RequestDelegate委托,去执行下一个中间件。

中间件实现原理

  1. 通过Use的方式进行注册就是在集合里面添加元素,该元素就是一个Func委托,Func委托的入参是 RequestDelegate,返回值也是RequestDeleagate。
  2. 最后需要调用该集合的Reverse方法,把集合里面的元素进行反转。
  3. 如果对该集合的元素不进行反转,就会先执行最后加入的中间件。

应用场景

异常处理

  1. 可以自定义中间件来处理异常,这类异常属于Action方法之外的异常。
  2. 最常见的就是输入一个不存在的路径,然后服务端返回的HTTP响应状态码是400,表示这个HTTP的 请求是错误的。

防盗链

中间件/IIS

  1. 也可以自定义中间件来进行防盗链。
  2. 在HTTP协议中,有一个请求头的键名叫做referer。
  3. 可以通过referer来跟踪网站的来源,如果检测到referer的域名地址不是当前网站的域名地址,就需要 对当前HTTP的请求进行阻止。
  4. 如果服务器使用的是IIS,需要通过第三方的插件来实现防盗链的功能,比较常用的一款插件叫做 ISAPI_Rewrite。

referer真的能防盗链?

  1. referer只能在一定程度上进行防盗链。
  2. 很多Web项目的测试工具,都是可以直接在HTTP请求中设置referer。
  3. 如果盗链的网站使用的是HTTPS协议,而图片的链接使用的是HTTP协议,从HTTPS向HTTP发起的请 求,会不带referer。
  4. 这是因为HTTPS是安全的传输协议,它规定了客户端不应该在非安全的HTTP请求中包含referer字段。
  5. 如果代码写的不严谨,没有判断referer为空的情况,就会绕过防盗链的检查。
  6. 所以想要更严格的防盗链,就可以考虑使用Nginx。

ConfigureServices/Configure

ConfigureServices

  1. ConfigureServices方法主要是服务的注册。
  2. .NetCore自己的服务注册完成以后才会去调用ConfigureServices方法,用来注册用户自定义的服务。

Configure

Configure方法主要是中间件的注册。

HttpClientFactory

  1. .NetCore提供了HttpClientFactory对象来发送HTTP的请求。
  2. 在.NetFramework中没有HttpClientFactory对象。所以只能不断的创建HttpClient对象,最终TCP的连 接数会被耗尽。虽然使用了using的方式在退出前调用了Dispose方法可以将HttpClient对象占用的非 托管资源给释放掉,但是TCP仍然处于保持连接的状态,一般在240秒后才会自动断开。
  3. 所以当短期的HTTP请求过多时,就可能导致套接字资源耗尽的异常。如果不想释放创建的HttpClient 对象,就可以将它作为单例一直使用,这样就解决了套接字资源耗尽的问题。
  4. 但是当主机的DNS有更新时,就有可能产生无法解析主机名称的异常。因为单例的HttpClient对象是 不会随着DNS的更新去进行更新的。
  5. 所以.NetCore就提供了HttpClientFactory对象来彻底解决这些问题。在HttpClientFactory对象的内部管 理着一个TCP的连接句柄池,会对每一个HttpClient对象使用一个句柄进行跟踪管理,当该实例使用 完毕之后,句柄仍然控制着资源的释放。
  6. 所以在处理短期大量的HTTP请求时,可以通过句柄对不同的HTTP请求实例进行跟踪管理,从而让TCP 套接字的生命周期延长,完成对套接字的复用。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38192821/article/details/130604236

智能推荐

java-net-php-python-ssm担保系统客户管理计算机毕业设计程序-程序员宅基地

文章浏览阅读81次。java-net-php-python-ssm担保系统客户管理计算机毕业设计程序。JSP教学视频点播系统的设计与实现SQLServer。ssm基于Java的废品回收管理系统的设计与实现。ssm基于SpringMVC的时鲜蔬菜配送系统。ssm基于SpringMvC的流浪狗领养系统。jsp绿色生活基于PSDW的绿色环保宣传网站。ssm基于OO的生鲜果蔬电商的设计与实现。

Redis安装部署-程序员宅基地

文章浏览阅读3.8k次。Redis安装部署下载编译*本系统环境为:CentOS_7_2009,X86_64下载源码包:https://redis.io/download上传离线压缩包或者下载到公共目录:/usr/local/redis/$ cd /usr/local/redis/ $ wget https://download.redis.io/releases/redis-6.2.6.tar.gz$ tar -zxvf redis-6.2.6.tar.gz$ ln -s redis-6.2.6 redis #创建_redis安装部署

Linux查询提取指定时间段的日志_linux截取一段时间内的日志-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏23次。在 Linux 中,可以使用 "sed、akw" 命令快速提取一个日志文件中指定时间段之间的日志信息。_linux截取一段时间内的日志

Tomcat配置JDK和JRE_tomcat设置jre-程序员宅基地

文章浏览阅读5.8k次,点赞5次,收藏27次。解决tomcat在cmd下运行startup提示:The JRE_HOME environment variable is not defined correctly This environment variable is needed to run this program如果提示startup不是内部或外部命令也是需要配置tomcat的环境变量_tomcat设置jre

ClionIDE通过指定编译器编译_clion设置编译器路径-程序员宅基地

文章浏览阅读1.4k次。通过clion指定mingw或VS对代码进行编译。_clion设置编译器路径

STM32F103ZET6【标准库函数开发】------05.1 通用定时器TIM3输出四路PWM,同频率不同占空比_stm32f103zet6完全重映射代码-程序员宅基地

文章浏览阅读862次,点赞3次,收藏21次。通用定时器有4个,TIM2,TIM3,TIM4,TIM5TIM1和TIM8挂载APB2下面;TIM2,TIM3,TIM4,TIM5挂载APB1下面。以TIM3为例无映射:时钟使能PA PB TIM3部分重映射:时钟使能PB TIM3完全重映射:时钟使能PC TIM3_stm32f103zet6完全重映射代码

随便推点

idea生成SpringBoot项目端口号的修改_idea如何设置8080端口-程序员宅基地

文章浏览阅读2.4k次。idea生成SpringBoot项目端口号的修改第一次使用idea,在生成SpringBoot项目的时候,提示端口8080被占用,这个时候有两个办法:1、修改端口号(推荐)①如果是.yml配置文件,添加server:port:8888,格式和下图相同,需要注意的一点是,server必须和spring同列,否则无效②如果是properties文件,配置文件中添加 server.port=88..._idea如何设置8080端口

编程语言和操作系统是什么关系?编程语言如何被计算机执行的?驱动程序的理解?_操作系统和编程语言的关系-程序员宅基地

文章浏览阅读2.2k次。我们平常所提到的计算机的内存指的是动态内存(即DRAM),动态内存中所谓的“动态”,指的是当我们将数据写入DRAM后,经过一段时间,数据会丢失,因此需要一个额外设电路进行内存刷新操作。但时间一长,代表1的电容会放电,代表0的电容会吸收电荷,这就是数据丢失的原因。我们都知道,中间层是为了提供抽象转换而存在的,而这套叫做操作系统的中间层,定义了一套规则,使得后续的可执行程序能够更容易的被运行起来,而且能更容易的利用各种硬件(显示,键盘等等),能够调用一些库来消除不同的程序间重复的运行逻辑。_操作系统和编程语言的关系

ACProtect2.0脱壳-程序员宅基地

文章浏览阅读378次。这上以前加入黑手安全网上做的教程,也搬过来吧目标程序:红盟(内部版)TNT社工辅助.exe所加的壳:ACProtect 2.00 - RISCO Software Inc.首先忽略所有异常,隐藏下od脱壳步骤:1.程序附加(程序附加后会停在系统的领空)代码:7C92120F C3 RETN7C921210 8BFF MOV EDI,EDI7C921212 > CC INT3..._acprotect 教程

下垂控制实现混合储能功率分配控制,下垂电流均衡控制,母线电压补偿_蓄电池下垂控制-程序员宅基地

文章浏览阅读174次。混合储能功率分配,下垂控制,功率均衡,母线电压补偿_蓄电池下垂控制

谈谈UVM中事务级建模(TLM)的uvm_tlm_fifo-程序员宅基地

文章浏览阅读1.4k次。在前面文章的producer和consumer示例中,只存在一个进程。producer调用put时执行了consumer中的put方法,consumer调用get时执行了producer..._uvm_tlm_analysis_fifo默认深度

如何在Ubuntu中安装libevent库_ubuntu 安装libevent-程序员宅基地

文章浏览阅读542次。在当前目录下:tar -zxvf +自己下载的安装包名字,我的是:tar -zxvf libevent-2.1.12-stable.tar.gz。那就使用这个命令:sudo apt-get install libssl-dev 安装openssl。在这个目录下的终端输入:./configure --prefix=/usr。安装完成后继续输入:./configure --prefix=/usr。如果这个命令下面输出一大堆东西就代表安装成功,啥也没输出代表安装失败。我下载的是这个压缩包。_ubuntu 安装libevent