MVC5管道模型+一个http请求最终怎么到MVC程序的

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
原文地址:https://www.cnblogs.com/LZXX/p/15703211.html