zoukankan      html  css  js  c++  java
  • DotNet Core管道通信

    前言

    在之前,我们需要明确的一个概念是, Web 程序中,用户的每次请求流程都是线性的,放在 ASP.NET Core 程序中,都会对应一个 请求管道(request pipeline),在这个请求管道中,我们可以动态配置各种业务逻辑对应的 中间件(middleware),从而达到服务端可以针对不同用户做出不同的请求响应。

    在 ASP.NET Core 中,管道式编程是一个核心且基础的概念,它的很多中间件都是通过 管道式 的方式来最终配置到请求管道中的,所以理解这里面的管道式编程对我们编写更加健壮的 DotNetCore 程序相当重要。

     

    从图中可以看出大致线性过程就是请求被Kestrel<Service>接收后,由中间件进行一系列的处理后,响应给Service,再呈现给用户。

    下面是我结合DotNet Core中请求源码给出的UML图(不完全是的)。


     
     

    管道通信图示解析

    可以看到最重要的四个部分是WebHostBuilder、WebHost、Server、HttpApplicaiton。从部署好DotNet Core项目开始构建主机的WebHostBuilder.Build().Run();开始,我们的主机宿主就构建服务器Kestrel,并启动监听并提供FeatrueCollection给HttpApplication构建HttpContext。

    默认的会构建DefaultHttpContext,包含Context的Scope,StartTimeStamp等属性,并实现IFeatrueCollection方法,从而提供Service上下文属性,从而运行服务器。如代码所示

     1   public class HttpListenerServer : IServer
     2   {
     3       public HttpListener Listener { get; }
     4       public HttpListenerServer(string url)
     5       {
     6           this.Listener = new HttpListener();
     7           this.Listener.Prefixes.Add(url ?? "http://localhost:3721/");
     8       }
     9       public void Start<TContext>(IHttpApplication<TContext> application)
    10       {
    11           this.Listener.Start();
    12           while (true)
    13           {
    14               HttpListenerContext httpListenerContext = this.Listener.GetContext();
    15    
    16               HttpListenerContextFeature feature = new HttpListenerContextFeature(httpListenerContext);
    17               FeatureCollection contextFeatures = new FeatureCollection();
    18               contextFeatures.Set<IHttpRequestFeature>(feature);
    19               contextFeatures.Set<IHttpResponseFeature>(feature);
    20               TContext context = application.CreateContext(contextFeatures);
    21    
    22               application.ProcessRequestAsync(context)
    23                   .ContinueWith(_ => httpListenerContext.Response.Close())
    24                   .ContinueWith(_ => application.DisposeContext(context, _.Exception));
    25           }
    26       }
    27   }

    服务器在接收到上下文后,调用Start方法,并启动StartUpLoader,从而将实现了IApplicationBuilder的中间件,进行委托链式使用。

    总结

    虽然我们对这个模拟管道做了极大的简化,但是它依然体现了ASP.NET Core管道处理请求的真实流程,而且真实管道的创建方式也与模拟管道基本一致。如果读者朋友们能够对这个模拟管道具有深刻的理解,我相信对真实管道的把握就会变得非常容易。

  • 相关阅读:
    Mysql 高可用方案讨论
    python 自动化之路 day 20 Django进阶/BBS项目【一】
    python 自动化之路 day 18 前端内容回顾、补充/Django安装、创建
    python 自动化之路 day 19 Django基础[二]
    Mysql配置文件读取顺序
    Mysql中查看每个IP的连接数
    循环杀死Mysql sleep进程脚本
    JS设计模式——5.单体模式(用了这么久,竟全然不知!)
    JS设计模式——4.继承(示例)
    JS设计模式——4.继承(概念)
  • 原文地址:https://www.cnblogs.com/weilai1917/p/11907351.html
Copyright © 2011-2022 走看看