ASP.NET Core 是一个跨平台,开源的,轻量级,高性能 并且高度模块化的web框架,同时扩展性也是十分强,你能够在 request -> response 申请管道中安插各种中间件来依据本人的场景定制化,比如说:监督,路由,批改 request 或 response 音讯体,这篇文章咱们就来探讨 ASP.NET Core 中间件以及如何应用。

ASP.NET Core 中存在一条 中间件 链条,这条链是由一组 委托办法 组成,这些委托办法会一个接一个的被执行,request 申请会从这些中间件链条中流转,被流转到的组件,要么解决这个申请,要么将申请传给下一个中间件。

配置 中间件管道

中间件的管道配置是在 Startup.Configure 办法中 ,精确的说这里就是组装你的 ASP.Net Core 申请管道,ASP.Net运行时会主动调用这个 Configure 办法,代码如下:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IdentityDbContext dbContext)    {        app.UseDeveloperExceptionPage();                   app.UseStaticFiles();                  app.UseMvcWithDefaultRoute();    }

下面的代码展现了如何将 mvc 增加到 ASP.Net Core 的 申请解决管道 中,接下来筹备实现自定义中间件。

创立自定义中间件

能够利用 IApplicationBuilder 接口的扩大办法来构建你的中间件,为了代码可维护性,倡议将自定义的中间件逻辑独自放在一个类中,或者一个独自的我的项目中,这样你在更新这些代码的时候不须要更新业务逻辑层的代码。

有多种办法能够构建自定义中间件,我筹备来演示那最简略的一种,首先创立一个名为 MyCustomMiddleware 的cs类,骨架代码大略是这样:

    public class MyCustomMiddleware    {        //This is our custom middleware    }

接下来在类的构造函数中新增一个 RequestDelegate 参数,这个 RequestDelegate 委托的签名是接管 HttpContext 参数 并返回 Task,上面是批改后的 MyCustomMiddleware。

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

执行 自定义中间件

当初须要给 MyCustomMiddleware 提供一个可执行的办法,供 解决流 执行到这个类时执行此办法,就是上面的 Invoke ,有些敌人可能要问了,为啥肯定是 Invoke 办法,能够是其余的吗? 不能够的,这是 ASP.Net Core 中间件中约定的办法名, Invoke 办法中你能够实现监督或者批改 RequestResposne

    public class MyCustomMiddleware    {        private readonly RequestDelegate _next;        public MyCustomMiddleware(RequestDelegate next)        {            _next = next;        }        public async Task Invoke(HttpContext httpContext)        {            if (!httpContext.Request.Headers.Keys.Contains("Authentication-Key"))            {                httpContext.Response.StatusCode = 400;                await httpContext.Response.WriteAsync("Authentication key is missing...");                return;            }            else            {                //Write code here to validate the authentication key.            }            await _next.Invoke(httpContext);        }    }

参考下面的代码,中间件的作用就是判断 request header 中有没有无效的 authentication key,如果没有就会返回具体的错误信息给客户端。

创立扩大办法

接下来为方才创立的 自定义中间件 创立一个扩大办法,这么做的目标就是能够不便将 中间件 注入到 pipeline 中,官网的举荐做法就是在 IApplicationBuilder 接口上进行扩大,上面的代码展现了如何去实现。

    public static class MyCustomMiddlewareExtensions    {        public static IApplicationBuilder UseMyCustomMiddleware(this IApplicationBuilder builder)        {            return builder.UseMiddleware<MyCustomMiddleware>();        }    }

最初要做的就是在 Configure 办法下进行配置,在 app 参数下应用 UseMyCustomMiddleware() 即可,如下代码所示:

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

最初将程序跑起来,如下图:

从下面输入中能够看到,我的自定义中间件起作用了,能够看出中间件的做法让 web程序 扩展性大大提高,如果你想理解更多中间件的常识,可参考: https://docs.microsoft.com/en...

译文链接:https://www.infoworld.com/art...