zoukankan      html  css  js  c++  java
  • asp.net core中间件工作原理

      不少刚学习.net core朋友对中间件的概念一直分不清楚,到底StartUp下的Configure方法是在做什么?

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
      if (env.IsDevelopment())
       {
       app.UseDeveloperExceptionPage();
       }
    
      app.UseMvc();  
    }

      大家都说每个request进来都会对Configure方法中的中间件执行一遍,但通过调试发现,只有程序在启动时才会执行这段代码,过后的每次请求并不会进入

      下面给大家简单解释一下:

      假设有3个方法A B C,都有自己的业务逻辑,且参数类型与返回值类型相同

      public Task MethodA(HttpContext context);
      public Task MethodB(HttpContext context);
      public Task MethodC(HttpContext context);

      这个时候假设我通过某种手段将C方法放进B方法变成方法BC,类似:

      

    public Task MethodBC(HttpContext context)
    
    {
    
      //方法B原先逻辑
    
      return MethodC(context);
    
    }

      同理将方法BC放进方法A变成方法ABC:

      

    public Task MethodABC(HttpContext context)
    
    {
    
      //方法A原先逻辑
    
      return MethodBC(context);
    
    }
    展开后:
    public Task MethodABC(HttpContext context)
    
    {
    
      //方法A原先逻辑
    
      //方法B原先逻辑
        
        return MethodC(context);
    }

      将原本互不干执的3个方法揉进一个方法中,当服务器接收到请求时,封装好上下文丢进这个聚合方法

      换个思路,感觉观察者模式会不会更简单些,IServer中写个事件,有需要往里面注册就好了

      那怎么才可以将方法当个参数一样使用呢,自然是委托,下面官方的声明:

      中间件中最基础的组件,以HttpContext为参数,Task作为返回值

      delegate Task RequestDelegate(HttpContext context); 

      

      中间件的基本实现原理:

      public RequestDelegate Use(RequestDelegate @delegate)
    
    {
    
      return (context)=>
    
      {
    
        //一些逻辑
        return @delegate.Invoke(context);
      };
    
    }

    细细一想,是不是就是在@delegate前面加了一些逻辑后重新生成一个RequestDelegate返回

    g

  • 相关阅读:
    vue3.0之如何挂到vue原型,这种全局变量,方法,属性
    javascript中apply、call和bind的区别
    vue云标签效果升级版,动态钻形
    仅使用HTML和CSS实现的标签云效果 Fants
    export export default import * as zh
    vue国际化之vue-i18n使用
    linux 修改mysql 密码 (5.7版本)
    更改Java程序时间
    keepalive+mysql5.7
    mysql 授予用户所有权限
  • 原文地址:https://www.cnblogs.com/tey023/p/12026607.html
Copyright © 2011-2022 走看看