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. .NET Core Razor Pages中ajax get和post的使用

    ASP.NET Core Razor Pages Web项目大部分情况下使用继承与PageModel中的方法直接调用就可以(asp-page),但是有些时候需要使用ajax调用,更方便些.那么如何使用 ...

  2. 原生js复制粘贴上传图片前后台代码,兼容firebox,chrome, ie11,亲测有效

    需求:粘贴上传图片,截图工具,右键粘贴,或者ctrl+v粘贴 方法1:可直接套用富文本框的图片上传功能,完成复制粘贴 缺点:麻烦,样式难控制 方法2:用原生js完成,以下案例基于此,样式请自己动手调整 ...

  3. Xamarin.Forms 界面布局

    <!--margin表示控件相对StackLayout的位置是设置组件之间的距离,或者距离父组件边缘的距离,    他的四个值是左边距,上边距,右边距,下边距  -->    <!- ...

  4. Racket 命令行方式安装 collection

    最近在学习 SICP,里面用的 Lisp 系列的 Scheme.OS X 上要配置Scheme环境. Racket 完整的包要 110 M,mini 版只要10M.我只需要简单的命令行操作,显然选mi ...

  5. Unity Ruby's Adventure 第一步

    官方游戏教程:https://learn.unity.com/project/ruby-s-2d-rpg?language=en 鲁比大冒险是一个2D游戏入门教程,涉及动画,特效,UI,瓦片地图,音效 ...

  6. jar包要读取的资源文件路径问题

    本地调试读取文件没有问题 获取 Thread.currentThread().getContextClassLoader().getPath() 读取文件 打jar包之后 获取的路径出错 不能读取文件 ...

  7. Mac VMware Fusion CentOS7配置静态IP

    目录 安装CentOS7 配置静态IP 安装CentOS7 这里我们要安装CentOS7 64位,所以选择CentOS7 64位配置 我们点击存储后,vmware会自动帮我们创建一个虚拟机,但是我们还 ...

  8. k8s采坑记 - 解决二进制安装环境下证书过期问题

    前言 上一篇k8s采坑记 - 证书过期之kubeadm重新生成证书阐述了如何使用kubeadm解决k8s证书过期问题. 本篇阐述使用二进制安装的kubernetes环境,如何升级过期证书? k8s配置 ...

  9. SpringSession 独立使用

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...

  10. 修改HTML元素

    通过HTML DOM,JavaScript能够访问并修改HTML文档中的每个元素 修改元素文本内容 document.getElementById("p1").innerHTML= ...