1.core和MVC的区别
.net core:可以跨平台
.MVC5-其实也就是.net formwork:需要依赖于IIS 不能支持支持跨平台
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管道
- 10.asp.net管道的执行 从HttpRuntim.ProcessRequest(HttpWorkerRequest)开始 HttpWorkerRequest(就是包含http请求包装过来的相关参数)
- 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