首页 > 技术文章 > MVC5管道模型+一个http请求最终怎么到MVC程序的

LZXX 2021-12-17 17:35 原文

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运行时(到这里才真正的进入了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

 

推荐阅读