返回顶部
首页 > 资讯 > 精选 >ASP.NET Core中间件Middleware是什么
  • 330
分享到

ASP.NET Core中间件Middleware是什么

2023-06-26 05:06:29 330人浏览 安东尼
摘要

本篇内容介绍了“asp.net Core中间件Middleware是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是中间件

本篇内容介绍了“asp.net Core中间件Middleware是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

什么是中间件(Middleware)?

中间件是组装到应用程序管道中以处理请求和响应的软件。 每个组件:

  • 选择是否将请求传递给管道中的下一个组件。

  • 可以在调用管道中的下一个组件之前和之后执行工作。

请求委托(Request delegates)用于构建请求管道,处理每个Http请求。

请求委托使用RunMapUse扩展方法进行配置。单独的请求委托可以以内联匿名方法(称为内联中间件)指定,或者可以在可重用的类中定义它。这些可重用的类和内联匿名方法是中间件或中间件组件。请求流程中的每个中间件组件都负责调用流水线中的下一个组件,如果适当,则负责链接短路。

将HTTP模块迁移到中间件解释了ASP.net core和以前版本(ASP.net)中的请求管道之间的区别,并提供了更多的中间件示例。

使用 IApplicationBuilder 创建中间件管道

ASP.net core请求流程由一系列请求委托组成,如下图所示(执行流程遵循黑色箭头):

ASP.NET Core中间件Middleware是什么

每个委托可以在下一个委托之前和之后执行操作。委托还可以决定不将请求传递给下一个委托,这称为请求管道的短路。短路通常是可取的,因为它避免了不必要的工作。例如,静态文件中间件可以返回一个静态文件的请求,并使管道的其余部分短路。需要在管道早期调用异常处理委托,因此它们可以捕获后面管道的异常。

最简单的可能是ASP.Net Core应用程序建立一个请求的委托,处理所有的请求。此案例不包含实际的请求管道。相反,针对每个HTTP请求都调用一个匿名方法。

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!");        });    }}

第一个 app.Run 委托终止管道。

有如下代码:

ASP.NET Core中间件Middleware是什么

通过浏览器访问,发现确实在第一个app.Run终止了管道。

ASP.NET Core中间件Middleware是什么

您可以将多个请求委托与app.Use连接在一起。 next参数表示管道中的下一个委托。 (请记住,您可以通过不调用下一个参数来结束流水线。)通常可以在下一个委托之前和之后执行操作,如下例所示:

public class Startup{    public void Configure(IApplicationBuilder app)    {        app.Use(async (context, next) =>        {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 from 2nd delegate.\r\n");        await context.Response.WriteAsync("结束第二个委托\r\n");});    }}

使用浏览器访问有如下结果:

ASP.NET Core中间件Middleware是什么

可以看出请求委托的执行顺序是遵循上面的流程图的。

注意:

响应发送到客户端后,请勿调用next.Invoke。 响应开始之后,对HttpResponse的更改将抛出异常。 例如,设置响应头,状态代码等更改将会引发异常。在调用next之后写入响应体。

  • 可能导致协议违规。 例如,写入超过content-length所述内容长度。

  • 可能会破坏响应内容格式。 例如,将html页脚写入CSS文件。

HttpResponse.HasStarted是一个有用的提示,指示是否已发送响应头和/或正文已写入。

顺序

Startup。Configure方法中添加中间件组件的顺序定义了在请求上调用它们的顺序,以及响应的相反顺序。 此排序对于安全性,性能和功能至关重要。

Startup.Configure方法(如下所示)添加了以下中间件组件:

  • 异常/错误处理

  • 静态文件服务

  • 身份认证

  • mvc

public void Configure(IApplicationBuilder app){    app.UseExceptionHandler("/Home/Error"); // Call first to catch exceptions                                            // thrown in the following middleware.    app.UseStaticFiles();                   // Return static files and end pipeline.    app.UseAuthentication();               // Authenticate before you access                                           // secure resources.    app.UseMvcWithDefaultRoute();          // Add MVC to the request pipeline.}

上面的代码,UseExceptionHandler是添加到管道中的第一个中间件组件,因此它捕获以后调用中发生的任何异常。

静态文件中间件在管道中提前调用,因此可以处理请求和短路,而无需通过剩余的组件。 静态文件中间件不提供授权检查。 由其提供的任何文件,包括wwwroot下的文件都是公开的。

如果请求没有被静态文件中间件处理,它将被传递给执行身份验证的Identity中间件(app.UseAuthentication)。 身份不会使未经身份验证的请求发生短路。 虽然身份认证请求,但授权(和拒绝)仅在MVC选择特定的Razor页面或控制器和操作之后才会发生。

授权(和拒绝)仅在MVC选择特定的Razor页面或Controller和Action之后才会发生。

以下示例演示了中间件顺序,其中静态文件的请求在响应压缩中间件之前由静态文件中间件处理。 静态文件不会按照中间件的顺序进行压缩。 来自UseMvcWithDefaultRoute的MVC响应可以被压缩。

public void Configure(IApplicationBuilder app){    app.UseStaticFiles();         // Static files not compressed    app.UseResponseCompression();    app.UseMvcWithDefaultRoute();}

Use, Run, 和 Map

你可以使用UseRunMap配置HTTP管道。Use方法可以使管道短路(即,可以不调用下一个请求委托)。Run方法是一个约定, 并且一些中间件组件可能暴露在管道末端运行的Run [Middleware]方法。Map*扩展用作分支管道的约定。映射根据给定的请求路径的匹配来分支请求流水线,如果请求路径以给定路径开始,则执行分支。

public class Startup{    private static void HandleMapTest1(IApplicationBuilder app)    {        app.Run(async context =>        {            await context.Response.WriteAsync("Map Test 1");        });    }    private static void HandleMapTest2(IApplicationBuilder app)    {        app.Run(async context =>        {            await context.Response.WriteAsync("Map Test 2");        });    }    public void Configure(IApplicationBuilder app)    {        app.Map("/map1", HandleMapTest1);        app.Map("/map2", HandleMapTest2);        app.Run(async context =>        {            await context.Response.WriteAsync("Hello from non-Map delegate. <p>");        });    }}

ASP.NET Core中间件Middleware是什么

下表显示了使用以前代码的 http://localhost:19219 的请求和响应:

请求响应
localhost:1234Hello from non-Map delegate.
localhost:1234/map1Map Test 1
localhost:1234/map2Map Test 2
localhost:1234/map3Hello from non-Map delegate.

当使用Map时,匹配的路径段将从HttpRequest.Path中删除,并为每个请求追加到Http Request.PatHBase

MapWhen根据给定谓词的结果分支请求流水线。 任何类型为Func<HttpContext,bool>的谓词都可用于将请求映射到管道的新分支。 在以下示例中,谓词用于检测查询字符串变量分支的存在:

public class Startup{    private static void HandleBranch(IApplicationBuilder app)    {        app.Run(async context =>        {            var branchVer = context.Request.Query["branch"];            await context.Response.WriteAsync($"Branch used = {branchVer}");        });    }    public void Configure(IApplicationBuilder app)    {        app.MapWhen(context => context.Request.Query.ContainsKey("branch"),                               HandleBranch);        app.Run(async context =>        {            await context.Response.WriteAsync("Hello from non-Map delegate. <p>");        });    }}

ASP.NET Core中间件Middleware是什么

以下下表显示了使用上面代码 http://localhost:19219 的请求和响应:

请求响应
localhost:1234Hello from non-Map delegate.
localhost:1234/?branch=1Branch used = master

Map支持嵌套,例如:

app.Map("/level1", level1App => {       level1App.Map("/level2a", level2AApp => {           // "/level1/level2a"           //...       });       level1App.Map("/level2b", level2BApp => {           // "/level1/level2b"           //...       });   });

Map也可以一次匹配多个片段,例如:

app.Map("/level1/level2", HandleMultiSeg);

内置中间件

ASP.NET Core附带以下中间件组件:

中间件描述
Authentication提供身份验证支持
CORS配置跨域资源共享
Response Caching提供缓存响应支持
Response Compression提供响应压缩支持
Routing定义和约束请求路由
Session提供用户会话管理
Static Files为静态文件和目录浏览提供服务提供支持
URL Rewriting Middleware用于重写 Url,并将请求重定向的支持

编写中间件

中间件通常封装在一个类中,并使用扩展方法进行暴露。 查看以下中间件,它从查询字符串设置当前请求的Culture:

public class Startup{    public void Configure(IApplicationBuilder app)    {        app.Use((context, next) =>        {            var cultureQuery = context.Request.Query["culture"];            if (!string.IsNullOrWhiteSpace(cultureQuery))            {                var culture = new CultureInfo(cultureQuery);                CultureInfo.CurrentCulture = culture;                CultureInfo.CurrentUICulture = culture;            }            // Call the next delegate/middleware in the pipeline            return next();        });        app.Run(async (context) =>        {            await context.Response.WriteAsync(                $"Hello {CultureInfo.CurrentCulture.DisplayName}");        });    }}

您可以通过传递Culture来测试中间件,例如 http://localhost:19219/?culture=zh-CN

以下代码将中间件委托移动到一个类:

using Microsoft.AspNetCore.Http;using System.Globalization;using System.Threading.Tasks;namespace Culture{    public class RequestCultureMiddleware    {        private readonly RequestDelegate _next;        public RequestCultureMiddleware(RequestDelegate next)        {            _next = next;        }        public Task Invoke(HttpContext context)        {            var cultureQuery = context.Request.Query["culture"];            if (!string.IsNullOrWhiteSpace(cultureQuery))            {                var culture = new CultureInfo(cultureQuery);                CultureInfo.CurrentCulture = culture;                CultureInfo.CurrentUICulture = culture;            }            // Call the next delegate/middleware in the pipeline            return this._next(context);        }    }}

以下通过IApplicationBuilder的扩展方法暴露中间件:

using Microsoft.AspNetCore.Builder;namespace Culture{    public static class RequestCultureMiddlewareExtensions    {        public static IApplicationBuilder UseRequestCulture(            this IApplicationBuilder builder)        {            return builder.UseMiddleware<RequestCultureMiddleware>();        }    }}

以下代码从Configure调用中间件:

public class Startup{    public void Configure(IApplicationBuilder app)    {        app.UseRequestCulture();        app.Run(async (context) =>        {            await context.Response.WriteAsync(                $"Hello {CultureInfo.CurrentCulture.DisplayName}");        });    }}

中间件应该遵循显式依赖原则,通过在其构造函数中暴露其依赖关系。 中间件在应用程序生命周期构建一次。 如果您需要在请求中与中间件共享服务,请参阅以下请求相关性。

中间件组件可以通过构造方法参数来解析依赖注入的依赖关系。 UseMiddleware也可以直接接受其他参数。

每个请求的依赖关系

因为中间件是在应用程序启动时构建的,而不是每个请求,所以在每个请求期间,中间件构造函数使用的作用域生命周期服务不会与其他依赖注入类型共享。 如果您必须在中间件和其他类型之间共享作用域服务,请将这些服务添加到Invoke方法的签名中。 Invoke方法可以接受由依赖注入填充的其他参数。 例如:

public class MyMiddleware{    private readonly RequestDelegate _next;    public MyMiddleware(RequestDelegate next)    {        _next = next;    }    public async Task Invoke(HttpContext httpContext, IMyScopedService svc)    {        svc.MyProperty = 1000;        await _next(httpContext);    }}

“ASP.NET Core中间件Middleware是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: ASP.NET Core中间件Middleware是什么

本文链接: https://lsjlt.com/news/307040.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ASP.NET Core中间件Middleware是什么
    本篇内容介绍了“ASP.NET Core中间件Middleware是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是中间件...
    99+
    2023-06-26
  • 理解ASP.NET Core 中间件(Middleware)
    目录中间件中间件管道RunUseUseWhenMapMapWhenRun & Use & UseWhen & Map & Map编写中间件并激活基于约...
    99+
    2024-04-02
  • ASP.Net Core MVC中间件是什么
    本篇内容介绍了“ASP.Net Core MVC中间件是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!讲中间件, 其...
    99+
    2023-06-29
  • ASP.NET Core中间件与管道的概念是什么
    今天小编给大家分享一下ASP.NET Core中间件与管道的概念是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-06-26
  • ASP.NET Core中间件如何使用
    今天小编给大家分享一下ASP.NET Core中间件如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.前言...
    99+
    2023-06-29
  • ASP.NET Core中间件怎么实现限流
    本篇内容介绍了“ASP.NET Core中间件怎么实现限流”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、限流算法在高并发系统中...
    99+
    2023-06-29
  • ASP.NET Core使用Middleware设置有条件允许访问路由
    目录1.简介2.实现1.简介 有时,我们可能在Web API中包含一些具有调试功能的请求。比如我们上次的文章中 为什么ASP.NET Core 数据库连接串的值和...
    99+
    2024-04-02
  • 详解ASP.NETCore中间件Middleware
    本文为官方文档译文,官方文档现已非机器翻译 https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/...
    99+
    2024-04-02
  • laravel的中间件middleware怎么用
    这篇文章将为大家详细讲解有关laravel的中间件middleware怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。中间件可以对请求进行过滤,这里可以利用中间件来验证用户是否登录,如果用户登录则可以...
    99+
    2023-06-21
  • Node.js怎么使用Middleware中间件
    今天小编给大家分享一下Node.js怎么使用Middleware中间件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。中间件中...
    99+
    2023-07-06
  • ASP.NET Core中间件初始化的实现
    目录前言  自定义的方式 Use方式 基于约定的方式 实现IMiddleware的方式 源码探究 Use扩展方法 UseMiddleware 总结 前言  ...
    99+
    2024-04-02
  • ASP.NET Core的中间件与管道介绍
    今天来讨论一个ASP.NET Core 很重要概念管道和中间件,在ASP.NET Core中,针对HTTP请求采用pipeline也就是通常说的管道方式来处理,而管道容器内可以挂载很...
    99+
    2024-04-02
  • ASP.NET Core中间件用法与官方常用中间件介绍
    目录一、什么是中间件中间件和过滤器的区别二、中间件常用方法1、Run方法2、Use方法3、Map方法4、Mapwhen方法三、自定义中间件四、官方常用中间件1、异常处理中间件2、HT...
    99+
    2024-04-02
  • ASP.NET Core中间件实现限流的代码
    目录一、限流算法1.计数器算法1.1 固定窗口算法1.2 滑动窗口算法2.令牌桶算法3.漏桶算法二、ASP.NET Core中间件实现限流1.中间件代码2.在管道中的使用一、限流算法...
    99+
    2024-04-02
  • ASP.NET Core使用自定义日志中间件
    这个日志框架使用的是ASP.NET Core的NLog,用来记录每次请求信息和返回信息。 1.首先创建一个Web应用项目,我选择的是MVC模板: 2.使用NuGet添加Micros...
    99+
    2024-04-02
  • ASP.NET Core中Startup类、Configure()方法及中间件详解
    ASP.NET Core 程序启动过程如下 1, Startup 类 ASP.NET Core 应用使用Startup类,按照约定命名为Startup。Startup类: 可选择性...
    99+
    2024-04-02
  • ASP.NET Core中间件初始化的实现方法
    小编给大家分享一下ASP.NET Core中间件初始化的实现方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言  在日常使用ASP.NET Core开发的过程中我们多多少少会设计到使用中间件的场景,...
    99+
    2023-06-15
  • ASP.NET Core中间件用法与官方常用中间件的示例分析
    小编给大家分享一下ASP.NET Core中间件用法与官方常用中间件的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、什么是中间件我们都知道,任何的一个web框架都是把http请求封装成一个管道,每一次...
    99+
    2023-06-29
  • ASP.NET Core中的wwwroot文件夹
    ASP.NET Core中wwwroot文件夹 默认情况下,ASP.NET Core应用程序中的wwwroot文件夹被视为webroot文件夹,并且该文件夹或目录应位于根项目文件夹中...
    99+
    2024-04-02
  • ASP.NET Core中的静态文件
    目录1.前言2.设置静态文件目录2.1 设置默认静态文件目录2.2 设置访问Web根目录外的文件3.设置HTTP响应标头4.静态文件授权5.启用目录浏览6.设置静态文件默认文档6.1...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作