中间件是一种装配到应用管道以处理请求和响应的软件。 每个组件:
- 选择是否将请求传递到管道中的下一个组件。
- 可在管道中的下一个组件前后执行工作。
请求委托用于生成请求管道, 请求委托处理每个 HTTP 请求。
1.中间件的定义
使用 Use
、Run
和 Map
配置 HTTP 管道。 Use
方法可使管道短路(即不调用 next
请求委托)。 Run
是一种约定,并且某些中间件组件可公开在管道末尾运行的 Run[Middleware]
方法。
Map 扩展用作约定来创建管道分支。 Map*
基于给定请求路径的匹配项来创建请求管道分支。
2.中间件的使用
概念性的东西,我们可以在网上找一大堆. 就不多说了. 下面我距离两种定义方式, 如果各位大神有其他的方式, 欢迎留言.
第一种是, 直接用app.UseMiddleware . 代码如下: 这里定义一个常规类MyMiddle . DataResult是我自定义实体类,用于返回公用信息的.
public class MyMiddle { private readonly RequestDelegate _next; public MyMiddle(RequestDelegate next) { this._next = next; } public Task Invoke(HttpContext context) { DataResult result = new DataResult() { verifiaction = false, message = "管道失效" + context.Request.Host.Value.ToString() }; return context.Response.WriteAsync(JsonConvert.SerializeObject(result)); } }
然后在 StartUp.cs 的 Configure 方法添加
app.UseMiddleware<MyMiddle>();
结果返回 dataresult 实体字符.
第二种 是用静态的, 也就是类似于内部本身提供的. 如app.UseCores(), app.UseMvc() .
首先, 定义自定义中间件静态类, 空间明明是 Microsoft.AspNetCore.Builder
namespace Microsoft.AspNetCore.Builder { public static class MMidelExtensions { public static IApplicationBuilder MMidel(this IApplicationBuilder app) { DataResult result = new DataResult() { verifiaction = true, message = "中间件的另一种写法" }; Func<RequestDelegate, RequestDelegate> middleware = next => { return context => { return context.Response.WriteAsync(JsonConvert.SerializeObject(result)); }; }; return app.Use(middleware); } } }
用法如下: StartUp.cs 的 Configure 方法添加
app.MMidel();
其实, 实际应用有很多方面, 比如, token验证, 还有暴力攻击拦截等等...都可以用中间件来进行拦截操作.