这篇文章探讨了让不同的请求去使用不同的中间件, 那么我们应该如何配置 ASP.NET Core 中间件? 其实中间件只是在 ASP.NET Core 中处理 web 请求的管道. 所有 ASP.NET Core 应用程序至少需要一个中间件来响应请求, 并且您的应用程序实际上只是中间件的集合. 当然 MVC 管道本身就是中间件, 早在 WebForm 时代就出现过 HttpModules,HttpHandler, 那个时候悠然记得我通过它们来组织我的广告系统, 不闲扯我们继续.
每个中间件组件都有一个带有 HttpContext 参数的 Invoke 方法. 您可以使用这个参数来处理方法.
- public async Task Invoke(HttpContext context)
- {
- if (context.Request.Path...)
- {
- await context.Response.WriteAsync("writing text...");
- }
- }
应用程序中最顶层的中间件将始终针对每个请求被调用. 这是由. NET 框架自动完成的. 中间件可以向客户端发送响应, 也可以调用下一个中间件. 对于后一种选择, 它当然需要访问下一个中间件组件. 这就是为什么大多数中间件组件都是使用带有 RequestDelegate 参数的构造函数定义的. 总之, RequestDelegate 会自动填充, 您无需在意.
中间件在 Startup.cs 的 Configure 方法中注册. Configure 方法具有 IApplicationBuilder 参数, 该参数提供了所有类型的中间件注册所需的方法, 我们试着去编写一个中间件.
- public class MyCustomMiddleware
- {
- private readonly RequestDelegate _next;
- public MyCustomMiddleware(RequestDelegate next)
- {
- _next = next;
- }
- public async Task Invoke(HttpContext context, IWebHostEnvironment env)
- {
- context.Response.Headers["app-name"] = env.ApplicationName+"Zaranet";
- context.Response.Headers["env-name"] = env.EnvironmentName+ "Zaranet";
- await _next(context);
- }
- }
随后我们在 Startup.cs 的 Configure 方法中通过 use 来注册自定义中间件.
- public void Configure(IApplicationBuilder App, ...)
- {
- App.UseMyCustomMiddleware();
- }
启动程序我们发现一些正常, 我们得到了我们想要的效果.
但实际上, 您很少需要直接调用 UseMiddleware, 因为中间件作者的标准方法是编写特定于所注册中间件的扩展方法:
- using MiddlerWareSolucation.MiddlerWare;
- using Microsoft.AspNetCore.Builder;
- namespace MiddlerWareSolucation.MiddlerWare_Extensions
- {
- public static class MyCustomMiddlewareExtensions
- {
- public static IApplicationBuilder UseMyCustomMiddleware(this IApplicationBuilder App)
- {
- App.UseMiddleware<MyCustomMiddleware>();
- return App;
- }
- }
- }
随后直接调用 Extensions 扩展方法, 效果还是一样的.
- public void Configure(IApplicationBuilder App, ...)
- {
- App.UseMyCustomMiddleware();
- }
部分时候我们想要通过客户端请求的路径来对我们的中间件进行启动, 当然 MapWhen 允许您通过指定谓词将中间件管道分成两个完全独立的分支:
- App.UseMiddlewareOne();
- App.MapWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
- {
- appBuilder.UseMiddlewareTwo();
- });
- App.UseMiddlewareThree();
在此示例中, 中间件 One 将始终执行, 如果请求路径以 "/ api" 开头, 则将执行中间件 Two. 否则, 将执行中间件 Three. 使用这种配置, 中间件 2 和中间件 3 都无法针对单个请求执行.
我想说的是最后一种情况是, 您希望大多数中间件针对所有请求运行, 但是您有一些条件件 - 特定中间件仅应针对某些请求运行.
这可以通过 UseWhen 轻松实现, UseWhen 还使用谓词来确定中间件是否应该运行:
- App.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
- {
- appBuilder.UseStatusCodePagesWithReExecute("/apierror/{0}");
- appBuilder.UseExceptionHandler("/apierror/500");
- });
这样就可以通过选择注册方式来自己控制中间件.
来源: https://www.cnblogs.com/ZaraNet/p/11799534.html