using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;

namespace 中间件的原理和使用
{
    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

        //IApplicationBuilder app 管道接口
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            //在使用中间件的时候要主要上下的位置,因为管道有先执行的好处和坏处

            #region 测试实例1
            ////可以是管道短路,所以下面我要手动进入下一个管道
            //app.Use(async (context, next) =>
            //{
            //    await context.Response.WriteAsync("进入第一个委托管道  开始<br/>");
            //    //进入下一个管道
            //    await next.Invoke();
            //    await context.Response.WriteAsync("进入第一个委托管道 结束 进入下一委托管道<br/>");
            //});

            ////app.Run是管道终结者
            //app.Run(async (context) =>
            //{
            //    await context.Response.WriteAsync("进入第二个委托管道  开始<br/>");
            //    await context.Response.WriteAsync("Hello World!<br/>");
            //    await context.Response.WriteAsync("进入第二个委托管道  结束<br/>");
            //});
            #endregion

            //Map是一个分支管道约束,第一个参数是请求的Url,第二个是函数
            app.Map("/tets1/Index", Test1);

            app.Map("/tets2", Test2);

            //也可以嵌套
            app.Map("/level1", level1App => {
                level1App.Map("/level2a", level2AApp => {
                    // "/level1/level2a"
                    //...
                });
                level1App.Map("/level2b", level2BApp => {
                    // "/level1/level2b"
                    //...
                });
            });

            //MapWhen可以看出来他是根据条件分开管道的第一个参数是一个Func<HttpContext,bool> 如果是真的就进入第二个方法
            app.MapWhen(context =>context.Request.Query.ContainsKey("Name"), Test3);

            //注入中间件 这个是第一个,还有一个是比较常用的静态封装
            app.UseMiddleware<Centre>();

            //这个就是静态封装的可以很好的保护你的代码
            app.UseFirstMiddleware();

            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("管道终结者来了");
            });

        }

        /// <summary>
        /// 第一个管道方法
        /// </summary>
        /// <param name="app"></param>
        static void Test1(IApplicationBuilder app) {
            app.Run(async (context) => {
                await context.Response.WriteAsync("进入第一个测试委托管道");
            });
        }

        /// <summary>
        /// 第二个管道方法
        /// </summary>
        /// <param name="app"></param>
        static void Test2(IApplicationBuilder app) {
            app.Run(async (context) => {
                await context.Response.WriteAsync("进入第一个测试委托管道");
            });
        }

        /// <summary>
        /// 第三个管道方法 但是他要满足一定的条件
        /// </summary>
        /// <param name="app"></param>
        static void Test3(IApplicationBuilder app)
        {
            app.Run(async (context) => {
                await context.Response.WriteAsync("沙雕你进入了我的规则");
            });
        }
    }
}
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace 中间件的原理和使用
{
    /// <summary>
    /// 静态封装
    /// </summary>
    public static class CustomMiddlewareExtensions
    {
        public static IApplicationBuilder UseFirstMiddleware(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<Centre>();
        }
    }

    public class Centre
    {
        /// <summary>
        /// 打管道注入进来
        /// </summary>
        private RequestDelegate _next;
        public Centre(RequestDelegate next) {
            _next = next;
        }

        public async Task Invoke(HttpContext context) {
            await context.Response.WriteAsync($"进入我的中间件的类");
            await _next(context);
        }
    }

}

上班没有什么时间,就直接上代码了,代码注释都有。

.net core 中间件使用的更多相关文章

  1. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  2. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  3. .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理

    .NET Core中间件的注册和管道的构建(1)---- 注册和构建原理 0x00 问题的产生 管道是.NET Core中非常关键的一个概念,很多重要的组件都以中间件的形式存在,包括权限管理.会话管理 ...

  4. ASP.NET Core 中间件Diagnostics使用

    ASP.NET Core 中间件(Middleware)Diagnostics使用.对于中间件的介绍可以查看之前的文章ASP.NET Core 开发-中间件(Middleware). Diagnost ...

  5. ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析

    ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...

  6. [转]ASP.NET Core 中间件详解及项目实战

    本文转自:http://www.cnblogs.com/savorboard/p/5586229.html 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际 ...

  7. net core 中间件详解及项目实战

    net core 中间件详解及项目实战 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的H ...

  8. 如何一秒钟从头构建一个 ASP.NET Core 中间件

    前言 其实地上本没有路,走的人多了,也便成了路. -- 鲁迅 就像上面鲁迅说的那样,其实在我们开发中间件的过程中,微软并没有制定一些策略或者文档来约束你如何编写一个中间件程序, 但是其中却存在者一些最 ...

  9. ASP.NET Core中间件实现分布式 Session

    1. ASP.NET Core中间件详解 1.1. 中间件原理 1.1.1. 什么是中间件 1.1.2. 中间件执行过程 1.1.3. 中间件的配置 1.2. 依赖注入中间件 1.3. Cookies ...

  10. ASP.NET Core 入门教程 9、ASP.NET Core 中间件(Middleware)入门

    一.前言 1.本教程主要内容 ASP.NET Core 中间件介绍 通过自定义 ASP.NET Core 中间件实现请求验签 2.本教程环境信息 软件/环境 说明 操作系统 Windows 10 SD ...

随机推荐

  1. 《Java基础知识》Java方法重载和重写

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类 ...

  2. SpringCloud分布式配置中心

    一.什么是配置中心 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud c ...

  3. 使用CocoaPods配置iOS百度地图sdk问题记录20191024

    1.在Podfile中加入添加库名 pod 'BaiduMapKit' #百度地图SDK 2.安装百度地图 pod install 出现问题: [!] Error installing BaiduMa ...

  4. Linux 终端(TTY)

    TTY 是 Teletype 或 Teletypewriter 的缩写,原来是指电传打字机,后来这种设备逐渐键盘和显示器取代.不管是电传打字机还是键盘显示器,都是作为计算机的终端设备存在的,所以 TT ...

  5. Android组件体系之Service解析

    一.调用方式    1.启动服务    只启动一个服务,不进行通信,包括startService.startForegroundService两种调用方式.第二种方式适用于后台应用启动前台服务,在启动 ...

  6. Python语法规则

    Python基本语法 Python的语法相对比C,C++,Java更加简洁,比较符合人的正常思维.本篇介绍Python的基本语法,通过本篇文章你可以学到以下内容. 掌握Python的基本语法 识别Py ...

  7. Splash 学习笔记

    一.介绍 Splash 跟之前我们介绍的 Selenium ( 参考 Selenium 与自动化测试 -- <Selenium 2 自动化测试实战>读书笔记) 很类似,都可以理解成一个浏览 ...

  8. 转pytorch中训练深度神经网络模型的关键知识点

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_42279044/articl ...

  9. autojump 之 git本地安装

      1.克隆autojump的repo,Terminal下执行:      git clone git://github.com/joelthelion/autojump.git      然后进入c ...

  10. Java中的日期与时间

    日期与时间 最常用的几个类,Date.DateFormat.Calendar.Locale Date 1.无参构造方法 //根据当前系统默认的毫秒值创建时间对象 public Date() { thi ...