文档章节

ASP.NET Core系列:中间件

o
 osc_g8254g7s
发布于 2019/08/19 17:18
字数 702
阅读 9
收藏 0

精选30+云产品,助力企业轻松上云!>>>

1. 概述

  ASP.NET Core中的中间件是嵌入到应用管道中用于处理请求和响应的一段代码。

2. 使用 IApplicationBuilder 创建中间件管道

2.1 匿名函数

  使用Run, Map, Use ,MapWhen等扩展方法来实现。

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Run(async context =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}

  第一个Run委托终止了管道。

  用 Use 将多个请求委托链接在一起。 next 参数表示管道中的下一个委托。 可通过不 调用 next 参数使管道短路。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.Use(async (context, next) =>
    {
        context.Response.ContentType = "text/plain;charset=utf-8";

        await context.Response.WriteAsync("进入第一个委托 执行下一个委托之前\r\n");

        // 调用管道中的下一个委托
        await next.Invoke();

        await context.Response.WriteAsync("结束第一个委托 执行下一个委托之后\r\n");
    });

    app.Run(async context =>
    {
        await context.Response.WriteAsync("进入第二个委托\r\n");

        await context.Response.WriteAsync("Hello World!\r\n");

        await context.Response.WriteAsync("结束第二个委托\r\n");
    });
}

2.2 自定义中间件类

  新建中间件类:MyMiddleware.cs

using Microsoft.AspNetCore.Http;

public class MyMiddleware
{
    private readonly RequestDelegate _next;

    // 在应用程序的生命周期中,中间件的构造函数只会被调用一次
    public MyMiddleware(RequestDelegate next)
    {
        this._next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        await context.Response.WriteAsync("Hello World!");

        await _next(context);
    }
}

  将自定义中间件配置到请求处理管道中,Startup.cs文件调整:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseMiddleware<MyMiddleware>();
}

  将中间件MyMiddleware改成扩展方法:

  新建扩展类MyMiddlewareExtension.cs

using Microsoft.AspNetCore.Builder;

public static class MyMiddlewareExtension
{
    public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder builder)
    {
        // 使用UseMiddleware将自定义中间件添加到请求处理管道中
        return builder.UseMiddleware<MyMiddleware>();
    }
}

  将自定义中间件配置到请求处理管道中,Startup.cs文件调整:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseMyMiddleware();
}

2.3 自定义中间件类传入初始参数

public class GreetingOption
{
    public string At { get; set; }

    public string To { get; set; }
}
using Microsoft.AspNetCore.Http;

public class GreetingMiddleware
{
    private readonly RequestDelegate _next;
    private readonly GreetingOption _option;

    public GreetingMiddleware(RequestDelegate next, GreetingOption option)
    {
        _next = next;
        _option = option;
    }

    public async Task Invoke(HttpContext context)
    {
        var message = $"Good {_option.At} {_option.To}";
        await context.Response.WriteAsync(message);
    }
}
using Microsoft.AspNetCore.Builder;

public static class GreetingMiddlewareExtension
{
    public static IApplicationBuilder UseGreetingMiddleware(this IApplicationBuilder app, GreetingOption option)
    {
        return app.UseMiddleware<GreetingMiddleware>(option);
    }
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseGreetingMiddleware(new GreetingOption
    {
        At = "Morning",
        To = "Libing"
    });
}

3. IMiddleware

  IMiddleware提供了强类型约束的中间件,其默认实现是MiddlewareFactory,接口定义如下:

public interface IMiddleware
{
    Task InvokeAsync(HttpContext context, RequestDelegate next);
}

  IMiddlewareFactory用于创建IMiddleware实例及对实例进行回收,接口定义:

public interface IMiddlewareFactory
{
    public IMiddleware Create (Type middlewareType);
    
    public void Release (IMiddleware middleware);
}

3.1 自定义IMiddleware类型中间件

  修改MyMiddleware,实现IMiddleware接口:

using Microsoft.AspNetCore.Http;

public class MyMiddleware : IMiddleware
{
    public async Task InvokeAsync(HttpContext context, RequestDelegate next)
    {
        await context.Response.WriteAsync("Hello World!");

        await next(context);
    }
}

  将自定义中间件配置到请求处理管道中,Startup.cs文件调整:

public void ConfigureServices(IServiceCollection services)
{
    // 在服务容器中注册自定义中间件
    services.AddSingleton<MyMiddleware>();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // 使用 UseMiddleware() 把自定义中间件添加到管道中
    app.UseMyMiddleware();
}
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
dotnet学习系列

这里整理下之前关于dotnet方面的文章索引。 一.dotnet core 系列 dotnet core 微服务教程 asp.net core 系列之并发冲突 asp.net core 系列之中间件进阶篇-编写自定义中间件(middleware) asp....

osc_03x3hb6x
2019/09/12
3
0
ASP.NET Core 从入门到精通-资源收集导航

ASP.NET Core 从入门到精通-资源收集导航 [TOC] 学习路线 来自 dotNET匠人 的(中文翻译) ASP.NET Core开发者成长路线图 原英文地址 ASP.NET Core Developer Roadmap 里面包含了 C#、Web、各类...

osc_2w18qc4t
02/03
11
0
16.ASP.NET Core应用程序中的开发者异常页面中间件

Developer Exception Page Middleware in ASP.NET Core Application 在这篇文章中,我将向大家介绍,怎么在ASP.NET Core应用程序中,使用异常页面中间件,来处理我们程序中未处理的异常。在阅...

osc_tmxtbi57
04/21
8
0
16.ASP.NET Core应用程序中的开发者异常页面中间件

原文:16.ASP.NET Core应用程序中的开发者异常页面中间件 Developer Exception Page Middleware in ASP.NET Core Application 在这篇文章中,我将向大家介绍,怎么在ASP.NET Core应用程序中,...

一条属于你的未来之路
04/20
0
0
16.ASP.NET Core应用程序中的开发者异常页面中间件

Developer Exception Page Middleware in ASP.NET Core Application 在这篇文章中,我将向大家介绍,怎么在ASP.NET Core应用程序中,使用异常页面中间件,来处理我们程序中未处理的异常。在阅...

osc_immhr7su
04/21
9
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux安装redis服务器和部署

Linux安装redis和部署 第一步:下载安装包 wget http://download.redis.io/releases/redis-5.0.5.tar.gz 访问https://redis.io/download 到官网进行下载。这里下载最新的5.0.5版本. 第二步:...

osc_3ytpwpyb
6分钟前
0
0
IF函数,根据条件设定输入内容

if函数通常用于条件判断,根据判断结果执行相应命令。 1.函数解释: IF(logical_test, [value_if_true], [value_if_false]) logical_test 必需。 计算结果为 TRUE 或 FALSE 的任何值或表达式...

osc_sumf8h95
8分钟前
0
0
Pytorch自定义dataloader以及在迭代过程中返回image的name

pytorch官方给的加载数据的方式是已经定义好的dataset以及loader,如何加载自己本地的图片以及label? 形如数据格式为 image1 label1 image2 label2 ... imagen labeln 实验中我采用的数据的...

osc_l8u38961
9分钟前
0
0
灯塔

\[love\ and \ share \] 我怎么感觉变成了好东西推荐呢?算了,本来也差不多 还没写完,想到再更 有好看玩的能不能评论一下,qwq 动漫 大多是些国漫,多在\(b\)站、腾讯视频、盗版小网站能够...

osc_dc6pbw3x
10分钟前
0
0
网易首页 」 网易手机 」 正文 苹果超薄触摸显示技术专利曝光:重新定义轻薄

最近,苹果公司的新屏幕专利技术已经曝光。特别是苹果公司的新型超薄触摸技术,它可以降低显示器的结构水平,消除多余的电路,并使屏幕更薄。该专利表明,这项新技术适用于iPhone,iPad,App...

osc_opzpp18v
11分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部