.NET Core开发日志——Middleware

熟悉ASP.NET架构的开发者一定对于HTTP Modules与HTTP Handlers不陌生。两者的作用主要是对网络请求执行特定的处理工作。而在.NET Core中,它们都被Middleware(中件间)取代了。

之前的Http Modules和HTTP Handlers是如下图般处理请求的:

640?wx_fmt=png

现在变成了这样:

640?wx_fmt=png

一言概括之,Middleware完成了HTTP Modules与HTTP Handlers的原有工作,但又不是简单的化二为一的减法作用。

Middleware减去的其实是与原来ASP.NET中重要的基础——应用程序生命周期事件(application life cycle event)的绑定。

HTTP Modules在初始化时就需要针对HttpApplication的事件作绑定处理,这样当HttpApplication的各项事件被触发时,已绑定的相应处理程序才会按照预期的那样被执行。

public class HelloWorldModule : IHttpModule{    public HelloWorldModule()    {}    public String ModuleName{        get { return "HelloWorldModule"; }}    // In the Init function, register for HttpApplication // events by adding your handlers.public void Init(HttpApplication application)    {application.BeginRequest += (new EventHandler(this.Application_BeginRequest));application.EndRequest += (new EventHandler(this.Application_EndRequest));}    private void Application_BeginRequest(Object source, EventArgs e)    {    // Create HttpApplication and HttpContext objects to access// request and response properties.HttpApplication application = (HttpApplication)source;HttpContext context = application.Context;context.Response.Write("<h1><font color=red>HelloWorldModule: Beginning of Request</font></h1><hr>");}    private void Application_EndRequest(Object source, EventArgs e)    {HttpApplication application = (HttpApplication)source;HttpContext context = application.Context;context.Response.Write("<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>");}    public void Dispose()    {}
}

然后你还需要在web.config配置文件注册这个HTTP Module。

<configuration><system.web><httpModules><add name="HelloWorldModule" type="HelloWorldModule"/></httpModules></system.web></configuration>

如果是用Middleware的话,事情就变得很简单了。抛弃IHttpModule接口及HttpModule实现类,不用再关心HttpApplication的任何事件,还有烦人的web.config配置。直接在代码中以最简洁的方式完成工作。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env){app.Use(async(context, next) =>{    
       await context.Response.WriteAsync("Beginning of Request\n");  
           await next.Invoke();      
           await context.Response.WriteAsync("End of Request\n");});app.Run(async (context) =>{        await context.Response.WriteAsync("Hello World!\n");}); }

640?wx_fmt=png

相似的,对于HTTP Handlers,虽然不用取消对HttpApplication事件的依赖,但以两者的代码实现方式作比较,Middleware亳无疑问胜出一筹。

public class HelloWorldHandler : IHttpHandler{  
 public HelloWorldHandler()    {}    
 
 public void ProcessRequest(HttpContext context)    {HttpRequest Request = context.Request;HttpResponse Response = context.Response;        // This handler is called whenever a file ending // in .sample is requested. A file with that extension// does not need to exist.Response.Write("<html>");Response.Write("<body>");Response.Write("<h1>Hello from a synchronous custom HTTP handler.</h1>");Response.Write("</body>");Response.Write("</html>");}  
 
   public bool IsReusable{        // To enable pooling, return true here.// This keeps the handler in memory.get { return false; }} }

仍需要在web.config文件中注册HTTP handler。

<configuration><system.web><httpHandlers><add verb="*" path="*.sample" type="HelloWorldHandler"/></httpHandlers></system.web></configuration>

换作Middleware的写法:

private static void HandleSample(IApplicationBuilder app){app.Run(async context =>{        await context.Response.WriteAsync("Hello Sample");});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

public void Configure(IApplicationBuilder app, IHostingEnvironment env){app.MapWhen(context => context.Request.Path.Value.EndsWith("sample"), HandleSample); }

640?wx_fmt=png

总结下使用Middleware的优点:

  • 没有对HttpApplication的依赖

  • 没有对IHttpModule与IHttpHandler接口的依赖

  • 无需在web.config文件中添加各种配置

  • 代码简洁

最后需要补充Middleware与HTTP Modules的一点差异。各Middleware中处理请求与响应的顺序是刚好相反的,越早处理请求的Middleware越晚处理响应。而HTTP Modules中处理请求与响应的顺序则保持一致,因为每个HTTP Module请求与响应事件的绑定都是在同一阶段完成的。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Identity Server 4 - Hybrid Flow - Claims

前一篇 Identity Server 4 - Hybrid Flow - MVC客户端身份验证: https://www.cnblogs.com/cgzl/p/9253667.htmlClaims我不知道怎么样翻译这个词比较好, 所以我一般就不翻译了.在前一篇文章里, MVC客户端配置身份认证的时候有这么一句话(Startup的ConfigureServices):JwtSecurit…

图像处理作业第7次

图像处理作业第7次 1.请根据课本中Z变换的定义&#xff0c;证明如下结论。 (1)若x(n)x(n)x(n)的ZZZ变换为X(z)X(z)X(z)&#xff0c;则(−1)nx(n)(-1)^nx(n)(−1)nx(n)的ZZZ变换为X(−z)X(-z)X(−z) 根据ZZZ变换的定义 X(z)∑x(n)z−n,∑(−1)nx(n)z−n∑x(n)(−z)−nX(−z)X(z…

微软宣布ASP.NET Core 2.0正式支持OData标准

近日&#xff0c;OData 团队在微软开发者博客上宣布&#xff0c;ASP.NET Core 2.0 已正式支持 OData 标准&#xff0c;开发者现在可通过包管理器 NuGet 来获取 Microsoft.AspNetCore.OData 包。此软件包包含在使用 ASP.NET Core MVC 时创建 OData v4.0 端点以及支持 Web API 的…

图像处理作业4

图像处理作业4 1. 第二版课本习题4.21 本质没有区别&#xff0c;只将图片放置在中心&#xff0c;而周围填充0的个数不变时&#xff0c;不会影响结果。因为本质都是进行了周期延拓&#xff0c;使得尾部的信息不会被丢弃掉。相当于滤波前将图像进行了平移。需要注意的是&#x…

[译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

园子里关于ASP.NET Core Web API的教程很多&#xff0c;但大多都是使用EFMysql或者EFMSSQL的文章。甚至关于ASP.NET Core Web API中使用DapperMysql组合的文章都很少&#xff0c;更别提OracelDapper组合的文章了&#xff0c;那么今天就带着大家一起翻译一篇国外大牛写的关于ASP…

一个c#开发的web绘流系统

本项目为Web版流程图绘图&#xff0c;兼容IE、FF、Chrome等各主流浏览器&#xff0c;提供了各类基础图形&#xff0c;至于如何应用及用来做什么就随各位了&#xff0c;常规的流程图及逻辑辅助、工作流等皆可胜任。本系统虽为开源项目&#xff0c;然精心调配开发测试&#xff0c…

将系统分解为微服务的策略

几年前&#xff0c;Vladik Khononov和他的团队决定开始使用微服务&#xff0c;但是几个月后他们发现自己陷入了巨大的混乱之中。他在最近于伦敦Skills Matter举行的DDD eXchange 2018会议上指出&#xff0c;造成这一现象的原因在于&#xff0c;他们只专注于采用酷炫的新技术&am…

.NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

一、案例结构总览这里&#xff0c;假设我们有两个客户端&#xff08;一个Web网站&#xff0c;一个移动App&#xff09;&#xff0c;他们要使用系统&#xff0c;需要先向IdentityService进行Login以进行验证并获取Token&#xff0c;在IdentityService的验证过程中会访问数据库以…

CentOS安装使用.netcore极简教程(免费提供学习服务器)

本文目标是指引从未使用过Linux的.Neter&#xff0c;如何在CentOS7上安装.Net Core环境&#xff0c;以及部署.Net Core应用。 仅针对CentOS&#xff0c;其它Linux系统类似&#xff0c;命令环节稍加调整&#xff1b;需要提前准备好服务器地址、用户名、密码&#xff1b;如果手上…

ASP.NET Core MVC+EF Core从开发到部署

笔记本电脑装了双系统&#xff08;Windows 10和Ubuntu16.04&#xff09;快半年了&#xff0c;平时有时间就喜欢切换到Ubuntu系统下耍耍Linux&#xff0c;熟悉熟悉Linux命令、Shell脚本以及Linux下的各种应用的安装、配置、运行。使用下来的感受是Linux确实相当好使&#xff0c;…

网络流及建模专题(上)

前言 不断更新中…… 这几天新坑填不下去了&#xff0c;回来回顾一些经典的模型套路&#xff0c;先拿网络流开刀&#xff0c;窃以为洛谷这几道网络流的题目还是非常具有代表性的&#xff0c;涵盖了网络流调整、多解计数、最小割、最大权闭合子图问题。 还涵盖了图论&#xff0…

基于 websocket 实现的 im 实时通讯案例

分享利用 redis 订阅与发布特性&#xff0c;巧妙的现实高性能im系统。为表诚意&#xff0c;先贴源码地址&#xff1a;https://github.com/2881099/im下载源码后的运行方法&#xff1a;运行环境&#xff1a;.NETCore 2.1 redis-server 2.8下载Redis-x64-2.8.2402.zip&#xff0…

ACM/ICPC 比赛生涯总结+经验分享

ACM/ICPC 比赛生涯总结经验分享 1.获奖经历 时间比赛奖励大一下ACM陕西省赛打铁大一下CCCC团队二等奖大二下ACM/ICPC全国邀请赛银奖大二下CCCC团队特等奖大三上ACM/ICPC区域赛沈阳站铜奖大三上ACM/ICPC区域赛南宁站银奖大三上ACM/ICPC EC-Final上海铜奖大三下CCCC团队特等奖大…

NCC Meetup 2018 Shanghai 活动小结

NCC Meetup 2018 上海的活动于2018年6月30日在微软上海港汇办公室进行。原本计划30人规模的小型活动&#xff0c;结果收到了逾60人的报名&#xff0c;其中大部均来到现场参加了活动。本次活动得到了微软公司的场地支持&#xff0c;同时非常感谢 范亮先生、 刘浩杨先生和 邹嵩…

Asp.Net Core 使用Quartz基于界面画接口管理做定时任务

今天抽出一点点时间来造一个小轮子&#xff0c;是关于定时任务这块的。这篇文章主要从一下几点介绍&#xff1a;创建数据库管理表创建web项目引入quarzt nuget 包写具体配置操作&#xff0c;实现定时任务处理第一步&#xff1a;创建一个空web项目&#xff0c;引入quarzt nuget …

.NET Core微服务之服务间的调用方式(REST and RPC)

一、REST or RPC ?1.1 REST & RPC微服务之间的接口调用通常包含两个部分&#xff0c;序列化和通信协议。常见的序列化协议包括json、xml、hession、protobuf、thrift、text、bytes等&#xff1b;通信比较流行的是http、soap、websockect&#xff0c;RPC通常基于TCP实现&am…

【记忆化搜索】【dfs】【递归】Chocolate

Chocolate 题目大意&#xff1a; 有一块巧克力&#xff08;每一个单位有一定的美味值&#xff09;&#xff0c;判断是否可以把他分为k块美味值相等的小巧克力 原题&#xff1a; 题目描述 Charlie 有一块巧克力。 这块巧克力是矩形的&#xff0c;有 n 行 m 列一共 n m 个大…

Nuget 多平台多目标快速自动打包

构建现代的 .Net 应用离不开 Nuget 的支持&#xff0c;而快速打包 Nuget 成了提高生产率的有效方法。1. 前置条件为了实现 Nuget 的快速打包&#xff0c;我们需要先解决一些前置依赖&#xff0c;无论是 .Net Framework、Mono 或者 .Net Standard&#xff08;.Net Core&#xff…

Identity Server 4 - Hybrid Flow - 使用ABAC保护MVC客户端和API资源

这个系列文章介绍的是Identity Server 4 实施 OpenID Connect 的 Hybrid Flow. 保护MVC客户端: Identity Server 4 - Hybrid Flow - MVC客户端身份验证, Identity Server 4 - Hybrid Flow - Claims保护API资源(这里用到了RBAC: Role-based Access Control 基于角色的访问权限控…

【图论】【并查集】矩形(ssl 1222)

矩形 ssl 1222 题目大意&#xff1a; 有n个矩阵&#xff0c;现在将有重叠部分的两个矩阵合并成一个图形&#xff0c;问有多少个图形 原题&#xff1a; 题目描述 在一个平面上有n个矩形。每个矩形的边都平行于坐标轴并且都具有值为整数的顶点。我们用如下的方式来定义块。…