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

智能推荐

模式分类识别 | Python实现基于LGBM模型的信用类型识别预测_lgbm流程图-程序员宅基地

文章浏览阅读1.0k次。模式分类识别 | Python实现基于LGBM模型信用类型识别预测_lgbm流程图

机器学习-(第二部分:神经网络/深度学习)-吴恩达-学习总结_吴恩达机器学习-程序员宅基地

文章浏览阅读340次。左边三个神经元称为一层,一层也可以像右边只有一个神经元。将负担性、知名度、感知质量等特征称为激活项它有多层,每层输入一个向量,输出另一个向量。输入层-隐藏层-输出层当你从数据中训练它时,你不需要明确第决定其他什么特征,比如知名度等等,神经网络可以自己计算出它想要在这个隐藏层中使用的特征。_吴恩达机器学习

每日一题|POJ3523 题解(双向BFS+状态压缩)-程序员宅基地

文章浏览阅读92次。如果我们当前在对q1进行bfs,我们知道,当前的f1[a1][b1][c1]由f1[a][b][c]推导而来,如果我们发现f2[a1][b1][c1]不为空,就说明我们从终点开始bfs的时候已经来到出现了鬼魂分别位于a1,b1,c1的状态,我们得到答案为f1[a][b][c]+f2[a1][b1][c1]+1。在每一步中,都可以同时移动任意数量的鬼魂。当f[a1][b1][c1]为-1时,f[a1][b1][c1] = f[a][b][c]+1,如果不是-1,说明已经走过了,continue。

奥格斯堡大学计算机系,奥格斯堡大学-程序员宅基地

文章浏览阅读95次。所在国家: 德国建立时间: 1970年校址 : 奥格斯堡校园组成:学校类型: 大学专业设置: 企业管理学、基础教育学、地理学、建筑技术学、数学、哲学、物理学、法学、社会经济学、运动学、语言学、经济数学、经济地理学、计算机学校性质:授予的学位: 学士、硕士和博士学校概况奥格斯堡大学位于巴伐利亚州奥格斯堡市,该地区是巴伐利亚州第三大经济区域。奥格斯堡大学始建于1970年。目前的教师及职员人数在千人以上..._德国奥格斯堡大学计算机系

习题 5-4 反片语(Ananagrams)UVa 156_输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本-程序员宅基地

文章浏览阅读385次。题目大意:输入一些单词,找出满足如下规则的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。判断时候字母不区分大小写,但是输出时候应该保留输入时候的大小写,并且按照字典序进行排序(大写字母排在小写字母前面)。实现1:(用数组模拟)#include#include#include#include#include #define maxn 1000using name_输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本

linux系统python截图不显示中文_LINUX系统python通过matplotlib绘图中文字体乱码-程序员宅基地

文章浏览阅读152次。LINUX系统python通过matplotlib绘图中文字体乱码,解决服务器里面没有字体的问题:查看环境input: 终端cat /etc/redhat-releaseoutput:CentOS Linux release 7.4.1708 (Core)服务器里面的字体路径,后续会更改该文件内容中的参数配置:input: pythonimport matplotlibmatplotlib.mat..._linux python 中文不显示

随便推点

小程序的前期学习_一个app包括json js和dll-程序员宅基地

文章浏览阅读407次。根目录下自定义组件新建custom-tab-bar/index把点击的active定义为共享的数据store.js// 创建store实例// 定义共享数据 数据字段activeTabBarIndex:0, //点击的下标​})})wxmljs​​store,},}},})}},​/*** 组件的初始数据*/data: {{"text": "首页",},{"text": "消息",},{"text": "联系我们",},{_一个app包括json js和dll

3、数据类型转换、引用传值(可变类型、不可变类型)-程序员宅基地

文章浏览阅读217次,点赞3次,收藏5次。数据类型转换、引用传值(可变类型、不可变类型)

第十二章:预处理命令-程序员宅基地

文章浏览阅读628次,点赞23次,收藏8次。第十二章:预处理命令宏定义、文件包含处理

SecretFlow安装,10天拿到阿里网络安全岗offer-程序员宅基地

文章浏览阅读343次,点赞5次,收藏8次。虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~还有大家最喜欢的黑客技术。

Linux进程线程学习笔记:进程控制-程序员宅基地

文章浏览阅读29次。Linux进程线程学习笔记:进程控制 周银辉创建新进程后得学好如何控制它,至少得知道如何“中止”它,下面介绍几个常用函数。1,进程的各个状态为了更好地理解进程控制,我们需要知道进程状态这个概念。和其他普通事物一样,进程始终处..._linux nimbus进程是什么4

PID温度控制-程序员宅基地

文章浏览阅读4.3k次,点赞20次,收藏74次。PID( 位置式)温度控制_pid温度控制