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. mysql重点中的重点---->查询中的关键字优先级

    1.from 找到表 2.where 拿着where指定的约束条件,去文件/表中取出一条条记录 3.group by 将取出的一条条记录进行分组group by ,如果没有group by ,则整体作 ...

  2. 用百度大脑技术让AI做回新闻主播!

    实现效果: 利用百度新闻摘要能力和微信小程序,快速抽取新闻摘要内容并进行语音播报,让AI做回新闻主播!本文主要介绍小程序功能开发实现过程,分享主要功能实现的子程序模块,都是干货哦!! 想了解pytho ...

  3. Mysql相关知识总结-持续更新~~~

    2019-12-11对varchar类型排序问题的解决 在mysql默认order by 只对数字与日期类型可以排序,但对于varchar字符型类型排序好像没有用了,下面我来给各位同学介绍varcha ...

  4. Linux电源管理(7)_Wakeup events framework

    1. 前言 本文继续"Linux电源管理(6)_Generic PM之Suspend功能"中有关suspend同步以及PM wakeup的话题.这个话题,是近几年Linux ker ...

  5. December 14th, Week 50th Saturday, 2019

    If you have got a talent, protect it. 如果你有天赋,要去保护她. From Jim Carrey. If you think you have a talent, ...

  6. 自学Java编程,如何混到一个7k薪资实习生的岗位

    现在Java软件开发的专业一直都是热门,有很多专业的学生,比如电子.机械.会计.土木等等专业由于专业本身没有更高的提升空间,所以现在的年轻人更加喜欢做一些科技前沿的工作,毕竟现在接触的都是电子产品.而 ...

  7. ASP.Net 设置 404错误跳转到指定页面

    分享 ASP.Net 网站设置 404错误跳转到指定页面的三种方法 方法一:Web.config 配置 1 首先双击打开项目中的“Web.config”文件  找到 system.web 节点,在 c ...

  8. C#中PadLeft,PadRight的用法

    今天在遇到一个需求的时候,需要一个字符串实现自增.是根据数据库中一个自增的int类型的值,实现自增的.但是要加上前缀.比如,数据库中有一个自增的值,为,2.那么这个自增的值后面的值就位3.4.5.6. ...

  9. Hive DDL、DML操作

    • 一.DDL操作(数据定义语言)包括:Create.Alter.Show.Drop等. • create database- 创建新数据库 • alter database - 修改数据库 • dr ...

  10. Redis面试篇 -- 如何保证缓存与数据库的双写一致性?

    如果不是严格要求“缓存和数据库”必须保证一致性的话,最好不要做这个方案:即 读请求和写请求串行化,串到一个内存队列里面去.串行化可以保证一定不会出现不一致的情况,但会导致系统吞吐量大幅度降低. 解决这 ...