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. IIS中部署网站

    1.安装开IIS,打开IIS(Win+R -->inetmgr.exe) 2.进入IIS主界面,右键网站,选择“添加网站”. 3.在“添加网站”对话框中,添加网站名称. 4.点击应用程序池选择, ...

  2. 第三次作业-Python网络爬虫与信息提取

    1.注册中国大学MOOC 2.选择北京理工大学嵩天老师的<Python网络爬虫与信息提取>MOOC课程 3.学习完成第0周至第4周的课程内容,并完成各周作业 过程. 5.写一篇不少于100 ...

  3. Mysql服务彪高排查方式及索引的正确使用步骤

    原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/12af580d-1 ...

  4. 不加班的秘诀:如何通过AOE快速集成NCNN?

    作为我司头发储量前三的程序员 始终仗着头发多奋斗在加班的第一线 时时灵魂拷问自己 年轻人,你凭什么不加班? 虽然我没有女朋友但是,我有代码呀 但我不明白的是,隔壁工位那个,到岗比我迟,下班比我早,天天 ...

  5. Springboot Activiti6 工作流 集成代码生成器 shiro 权限 vue.js html 跨域 前后分离

    官网:www.fhadmin.org 特别注意: Springboot 工作流  前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ activiti6.0 ...

  6. 查询BPC动态表

    今天BASIS说后台有张数据表(/1CPMB/ABLBCAD)数据量已超过20亿,需要归档,但是不清楚是哪个业务模型. 有两种方式可以查询BPC动态生成的表名. (1)根据命名规则 环境前缀:apps ...

  7. Cesium专栏-terrain地形、3dtiles模型、gltf模型 高度采样

    在Cesium中,对于terrain地形.3dtiles模型.gltf模型的高度采样是一个很基本的功能,基于此,可以做一些深度应用,而Cesium已经帮我们提供了相应的API,在这里,我帮大家总结一下 ...

  8. 云原生技术之Docker入门

    1. 为什么需要容器? 下图是一个比较传统的软件架构 做过java的同学可能对上图的架构方式比较了解,我们通常会将一个应用程序生成一个war包,放到一个tomcat容器当中并在一台虚拟机(VM)中启动 ...

  9. .NET机器学习 ML.NET 1.4预览版和模型生成器更新

    ML.NET 是面向.NET开发人员的开源和跨平台机器学习框架. ML.NET  还包括Model Builder  (一个简单的UI工具)和  CLI  ,使用自动机器学习(AutoML)构建自定义 ...

  10. .net core 2.1 Nlog.Web.AspNetCore Nlog日志

    1.先创建 .net core Web 应用程序,选择API 2.安装 Nuget 包:Nlog.Web.AspNetCore install-package Nlog install-package ...