.net core 2.0学习记录(四):Middleware使用以及模拟构建Middleware(RequestDelegate)管道
2024-08-27 16:10:46
.net Core中没有继续沿用以前asp.net中的管道事件,而是开发了一个新的管道(Middleware):
public class MiddlewareDemo
{
private readonly RequestDelegate _next; public MiddlewareDemo(RequestDelegate next)
{
_next = next;
} public Task Invoke(HttpContext httpContext)
{
//可以在此处写一些需要的代码
return _next.Invoke(httpContext);
}
}
在Startup的Configure方法中用UseMiddleware方法添加到管道中去
app.UseMiddleware<MiddlewareDemo>();
如果将_next.Invoke(httpContext)改成Task.CompletedTask那么后续添加的Middleware都不会执行了
public Task Invoke(HttpContext httpContext)
{
return Task.CompletedTask;
//return _next.Invoke(httpContext);
}
通过查看UseMiddleware方法源代码,发现其实际调用的是IApplicationBuilder的Use方法
模拟构建Middleware(RequestDelegate)管道
方便演示我们就创建控制台项目,代码如下:
public delegate Task RequestDelegate(Context context);
public class Context
{ }
class Program
{
static List<Func<RequestDelegate, RequestDelegate>> list = new List<Func<RequestDelegate, RequestDelegate>>();
static void Main(string[] args)
{
Use(next =>
{
return context =>
{
Console.WriteLine("");
return next.Invoke(context);
};
}); Use(next =>
{
return context =>
{
Console.WriteLine("");
return next.Invoke(context);
};
}); Use(next =>
{
return context =>
{
Console.WriteLine("");
return next.Invoke(context);
};
}); Build(); Console.Read();
} static void Use(Func<RequestDelegate, RequestDelegate> middleware)
{
list.Add(middleware);
} static void Build()
{
RequestDelegate endReq = (context) =>
{
Console.WriteLine("end");
return Task.CompletedTask;
};
list.Reverse(); //不反转的话最后添加的会先执行
foreach (var middleware in list)
{
endReq = middleware.Invoke(endReq);
}
//执行到此处endReq是第一个添加到list集合中的Middleware
endReq(new Context());
}
}
运行结果:
如果在某一个Use方法中不执行next.Invoke(context),那么后续使用Use方法添加的都不会执行了,改成如下:
Use(next =>
{
return context =>
{
Console.WriteLine("");
return Task.CompletedTask;
//return next.Invoke(context);
};
});
总结:
这样的一种模式扩展性比较好,比如一个项目中要使用MVC则写app.UseMvc来添加进去,使用Session,则用app.UseSession()。
Session/Route/Cros等都是使用Middleware来实现的
最新文章
- 用JqueryUI的Dialog+IFrame实现仿模态窗口效果
- 掌握SortSet接口和Set接口的关系,以及常用方法。
- linux下查看电脑配置
- [转载-仅为个人学习所用]Stack Menu
- 『安全科普』HTTP协议讲解及手工模拟发送
- thinkphp框架的路径问题 - 总结
- python成长之路——第四天
- java设计模式之——适配器模式
- 【转】Android 图层引导帮助界面制作
- UVALive - 4670 Dominating Patterns AC 自动机
- openstack第五章:cinder
- 一串数字中,只有一个数字出现一次,其他数字都出现两次,查找出这个数字(python)(原创)
- iOS 利用高德地图WMS服务
- 【转】STM32擦除内部FLASH时间过长导致IWDG复位分析
- Linux安装配置JDK1.7
- visual studio code插件精选
- ASP.NET 网站超时跳转到登录界面
- AngularJS 表达式 对象和数组
- 网络编程—代码—UDP数据报传输
- 面试----java基础集合---------------------comparable和comparator 的区别