.net core 源码解读
1.netcore程序启动的2个流程
启动流程:程序启动-初始化配置文件-初始化日志,初始化IOC容器,各种IOC注册,Kestrel服务器初始化,HttpPipeline初始化
响应流程:监听到请求,Kestrel监听到HttpRequest,解析成HttpConetext,交给HttpPipeline来处理、接口路由匹配、鉴权授权、控制器、VIew、Fiter过滤器、响应会发和资源释放
2. 浏览器请求到MVC程序步骤:
文字介绍:
- 1:浏览器发起URL请求
- 2:浏览器会先查看浏览器缓存系统缓存路由缓存, 如有存在缓存, 就直接显示。 如果没有, 接着第3步
- 3:url先到域名服务器解析(DNS)获取相应的 IP+端口 定位到服务器
- 4:浏览器向服务器发起 tcp 连接, 与浏览器建立 tcp 三次握手
- 5:握手成功, 浏览器向服务器发送 http 请求, 请求数据包(请求行,请求报头和请求正文。)
- 6:请求到达web服务器,IIS是一直监听某个设置好了的URL端口的,
- 7: IIS里面有一个HTTP.SYS的一个服务接收HTTP请求 转发给ISAPI
- 8: IIS里面的 一个ISAPI(IIS-处理程序映射) 根据URl路径的后缀区分程序(JAVA,aspx,.netcore,PHP)等进入到相应的程序(iis可以支持java,php的程序的)只要他们实现isapi
- 9: ISAPI把URl转交给asp.net运行时(到这里才真正的进入了asp.net的程序)
- 10.asp.net运行时的执行 从HttpRuntim.ProcessRequest(HttpWorkerRequest)开始 HttpWorkerRequest(就是包含http请求包装过来的相关参数)
图片介绍:
1.流程图
2.上面的执行的都是网络请求 然后把网络请求转发到了应用程序(application),然后应用程序的入口就是httpRuntime
类继承 Ihttpmodule 就可以单独做自己的事情 如:防盗链
.比如,A请求B网站的图片, 可以根据请求走 ImageHandler 设置黑白名单来进行防盗链
4.一般处理程序继承ihttpmodule 类(到这里就是用来处理具体业务逻辑了),handler执行流程如下(请求级处理,nvc,webform,都需要走这个流程)
- 11调用ProcessRequest方法进入管道
- 12 调用ProcessRequestNoDemand,从队列中接收到isapi写的请求
- 13 继续执行到ProcessRequestNow
- 14继续执行ProcessRequestInternal,判断服务器是否很忙,如果很忙,就响应服务器忙;准备HttpContext上下文;把参数HttpWorkerRequest 转换成aspNet上下文 httpContext;7.继续执行到ProcessRequestNow7.继续执行到ProcessRequestNow
- 15得到一个HttpContext上下文参数后,交给一个IhttpHander来处理;只要是实现了IhttpHander,都 是IHttpHander; 通过IhttpHandler来处理HttpContext
- 16:服务器请求数据, 将数据返回到浏览器
- 17:浏览器接收响应, 读取页面内容, 解析 html 源码, 生成 Dom 树
- 18:解析 css 样式、 浏览器渲染, js交互
怎么处理IhttpHandler呢?
自定义一个CustomHttpHander,实现IHttpHandler
public class CustomHttpHander : IHttpHandler
{
public bool IsReusable => true;
public void ProcessRequest(HttpContext context)
{
Console.WriteLine("101");
}
}
如果CustomHttpHander中的ProcessRequest 来处理Httpcontext:任何一个请求都会输出 101;
可以通过给事件注册动作,达到框架的灵活扩展;
public class CustomHttpHander : IHttpHandler
{
public bool IsReusable => true;
public event Action perRequet1;
public event Action PostRequet1;
public event Action perRequet2;
public event Action PostRequet2;
public event Action perRequet3;
public event Action PostRequet3;
public event Action perRequet4;
public event Action PostRequet4;
public void ProcessRequest(HttpContext context)
{
perRequet1?.Invoke();
perRequet2?.Invoke();
perRequet3?.Invoke();
perRequet4?.Invoke();
Console.WriteLine(" 1");
PostRequet1?.Invoke();
PostRequet2?.Invoke();
PostRequet3?.Invoke();
PostRequet4?.Invoke();
}
}
自定一个IhttpHander就能生效吗?
在aspNet管理到,每一个HttpHander都有一个HttpMoudle来初始化;
public class CustomHttpMoudle : IHttpModule
{
public void Dispose()
{
Console.WriteLine();
}
/// <summary>
/// HttpModule的Init方法就是专门用来给IHttpHander初始化事件的;
/// </summary>
/// <param name="context"></param>
public void Init(HttpApplication context)
{
context.BeginRequest += (e, x) => {
context.Context.Response.Write("CustomHttpMoudle.BeginRequest");
};
context.EndRequest += (e, x) => {
context.Context.Response.Write("CustomHttpMoudle.EndRequest");
};
}
}
webConfig增加节点:
webConfig增加节点:
<system.webServer>
<modules>
<add name="CustomHttpMoudleEvent" type="Zhaoxi.MVC5.Project.Utility.Pipelin.CustomHttpMoudleTest,Zhaoxi.MVC5.Project"></add>
<remove name="OutputCache"/>
</modules>
</system.webServer>
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Configlu路径下,有一个aspnet的Module 的默认配置;
- 13 继续执行到ProcessRequestNow
本文来自博客园,作者:12不懂3,转载请注明原文链接:https://www.cnblogs.com/LZXX/p/15703211.html