【.NET Core】管道,中间件

目录

中间件

添加中间件

中间件是有顺序的

.NET Core 3.1项目Configure方法介绍

自定义中间件

约定

自定义中间件


中间件

1.选择是否将请求传递给管道中的下一个中间件

2.在管道中的下一个中间件的前后执行工作

 

添加中间件

下面模拟添加一个中间件

在Startup的Configure中添加

可以通过Use或者Run添加

app.Use(async (context, next) =>
{
    await context.Response.WriteAsync("Hello Use!");
});

app.Run(async context =>
{
    await context.Response.WriteAsync("Hello Run!");
});

使用Use可以将请求传递给下一个中间件,可以使用await next();来传递,如果没有下一中间件时,则会报错,其实报错也是一个中间件,这才是最后的中间件

使用Run添加终端中间件,专门用来短路请求管道,放在最后

 

每一个中间件都有权做出决定是否将请求传递给下一个中间件,也可以直接做出响应,促使管道短路

短路就是指不再将请求继续往下传递,而是结束请求并开始响应

 

中间件是有顺序的

1.添加中间件的顺序就是请求调用这些中间件的顺序

2.请求和响应,方向相反,顺序也是相反的

app.Use(async (context, next) =>
{
    await context.Response.WriteAsync("Hello Use1 Begin\r\n");
    await next();
    await context.Response.WriteAsync("Hello Use1 End\r\n");
});
app.Use(async (context, next) =>
{
    await context.Response.WriteAsync("Hello Use2 Begin\r\n");
    await next();
    await context.Response.WriteAsync("Hello Use2 End\r\n");
});

app.Run(async context =>
{
    await context.Response.WriteAsync("Hello Run!\r\n");
});

看看执行顺序

这就是中间件在管道中的执行过程

 

.NET Core 3.1项目Configure方法介绍

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //坚持当前环境,是否开发环境
    if (env.IsDevelopment())
    {
        //开发人员异常页面
        app.UseDeveloperExceptionPage();
    }
    //路由中间件
    app.UseRouting();

    //终结点中间件,配置中间件和路由的关系
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGet("/", async context =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    });
}

 

自定义中间件

约定

1.具有类型RequestDelegate参数的公共构造函数

2.名为Invoke或者InvokeAsync的方法

3.必须返回Task

4.第一个参数必须为HttpContext

自定义中间件

public class TestMiddleware
{
  private readonly  RequestDelegate _next;
    public TestMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext httpContext)
    {
        //中间件的业务代码
        await httpContext.Response.WriteAsync("TestMiddleware\r\n");
        await _next(httpContext);
    }
}

添加中间件

app.UseMiddleware<TestMiddleware>();

添加扩展方法,模仿系统添加中间件过程

public static class TestMiddlewareExtensions
{
    public static IApplicationBuilder UserTest(this IApplicationBuilder app)
    {
        return app.UseMiddleware<TestMiddleware>();
    }
}

使用

app.UserTest();

 

相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页