asp.net core 中间件粗解
中间件
中间件在asp.net core中非常重要,它用来处理httpcontext。而httpcontext封装了请求和响应。也就是说,中间件是用来处理请求和响应的。
本质上,中间件被封装到了IApplicationBuilder这个接口中,他的实现类是ApplicationBuilder。源码在github:https://github.com/aspnet/HttpAbstractions
ApplicationBuilder有两个方法和一个字段比较重要:
private readonly IList<Func<RequestDelegate, RequestDelegate>> _components = new List<Func<RequestDelegate, RequestDelegate>>();
public IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware)
{
_components.Add(middleware);
return this;
}
public RequestDelegate Build()
{
RequestDelegate app = context =>
{
context.Response.StatusCode = ;
return Task.CompletedTask;
}; foreach (var component in _components.Reverse())
{
app = component(app);
} return app;
}
这个_components字段就是中间件的一个集合,在Startup类中,通过app.Use()和Run()还有Use***MIddleware等扩展方法,在背后是通过ApplicationBuilder这个类的本身的Use方法来转换成一个Func<RequestDelegate,RequestDelegate>,然后添加到_components这个字段上的。比如说我们会在Startup类中写这样的中间件(毫无意义的代码,纯粹是为了演示):
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("when a \n");
await next();
await context.Response.WriteAsync("after a \n");
});
这段代码中,app.Use是一个扩展方法,给这个方法传入了一个Func<HttpContext,Func<Task>,Task>,而这个扩展方法如下:
public static IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpContext, Func<Task>, Task> middleware)
{
return app.Use(next =>
{
return context =>
{
Func<Task> simpleNext = () => next(context);
return middleware(context, simpleNext);
};
});
}
在这个扩展方法的内部,还是最终调用了ApplicationBuilder的Use方法(不是扩展方法),这个方法在内部通过Func<Task> simpleNext = () => next(context);这段代码把传入的Func<HttpContext, Func<Task>, Task>中的Func<Task>参数转化成了内部的调用(有一些拗口,意思就是转化了一下,以便这个中间件能够继续调用HttpContext)最终,才调用传入的middleware。然后,将这个委托返回,最终,添加到了_component字段上面。
最新文章
- ::before和::after伪元素的用法
- 本地新建项目提交到github
- 巧用JS内置对象Function
- word-wrap、white-space和word break的区别
- 小记-虚拟机装ubuntu遇到问题
- 使用 archetype插件创建maven目录结构
- DropDownList1
- PHP用substr截取字符串出现中文乱码问题用mb_substr
- Android Webview 背景透明
- WPF如何实现类似iPhone界面切换的效果(转载)
- Yii框架中的CURD操作
- WebService开启远程测试
- 跟着刚哥梳理java知识点——运算符(五)
- Ant的使用
- LogCook 一个简单实用的Android日志管理工具
- ElasticSearch 学习记录之ES如何操作Lucene段
- 在网页中使用particlesjs实现背景的动态粒子特效
- 【译】.NET Core 3.0 中的新变化
- how2heap学习笔记
- HTML标签有序标签和无序标签
热门文章
- (3)Maven快速入门_3在Eclipse中创建Maven项目打包成jar
- java的ArrayList源码摘要
- 环境搭建 - Java(Windows)
- JavaScript 代码简洁之道
- Go开发之路 -- 流程控制
- 前端入门19-JavaScript进阶之闭包
- 使用 babel-loader(webpack)
- Html和Css学习笔记-html进阶-div与span
- js 数组插入和删除处理
- Django的urls.py加载静态资源图片,TypeError: view must be a callable or a list/tuple in the case of include().