中间件

中间件在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字段上面。

最新文章

  1. ::before和::after伪元素的用法
  2. 本地新建项目提交到github
  3. 巧用JS内置对象Function
  4. word-wrap、white-space和word break的区别
  5. 小记-虚拟机装ubuntu遇到问题
  6. 使用 archetype插件创建maven目录结构
  7. DropDownList1
  8. PHP用substr截取字符串出现中文乱码问题用mb_substr
  9. Android Webview 背景透明
  10. WPF如何实现类似iPhone界面切换的效果(转载)
  11. Yii框架中的CURD操作
  12. WebService开启远程测试
  13. 跟着刚哥梳理java知识点——运算符(五)
  14. Ant的使用
  15. LogCook 一个简单实用的Android日志管理工具
  16. ElasticSearch 学习记录之ES如何操作Lucene段
  17. 在网页中使用particlesjs实现背景的动态粒子特效
  18. 【译】.NET Core 3.0 中的新变化
  19. how2heap学习笔记
  20. HTML标签有序标签和无序标签

热门文章

  1. (3)Maven快速入门_3在Eclipse中创建Maven项目打包成jar
  2. java的ArrayList源码摘要
  3. 环境搭建 - Java(Windows)
  4. JavaScript 代码简洁之道
  5. Go开发之路 -- 流程控制
  6. 前端入门19-JavaScript进阶之闭包
  7. 使用 babel-loader(webpack)
  8. Html和Css学习笔记-html进阶-div与span
  9. js 数组插入和删除处理
  10. Django的urls.py加载静态资源图片,TypeError: view must be a callable or a list/tuple in the case of include().