.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,一经查实,立即删除!

相关文章

P3850-[TJOI2007]书架【Splay】

正题 题目链接:https://www.luogu.com.cn/problem/P3850 题目大意 一个书架上有nnn本书&#xff0c;进行mmm次插入操作&#xff0c;然后qqq次询问一个位置上的书。 解题思路 用SplaySplaySplay进行插入操作&#xff0c;然后直接查询即可 codecodecode #include<cstdio&g…

【并查集】家族 (ssl 1896)

家族 ssl 1896 题目大意&#xff1a; 合并一些集合&#xff0c;然后判断某两个点是否在同一个集合内 原题&#xff1a; 题目描述 若某个家族人员过于庞大&#xff0c;要判断两个是否是亲戚&#xff0c;确实还很不容易&#xff0c;现在给出某个亲戚关系图&#xff0c;求任…

模式识别作业

模式识别作业 1.说明判别分类器(如logistic回归)与上述特定类别的高斯朴素贝叶斯分类器之间的关系正是logistic回归所采用的形式。 经过第2问更加普遍的推导过程&#xff1a; 对应参数为&#xff1a; 二次项&#xff1a; v[σ112−σ1022σ112σ102,...,σD12−σD022σD12…

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…

【prim】【最小生成树】最优布线问题(ssl 1612)

最优布线问题 ssl 1612 题目大意&#xff1a; 求最小生成树 原题&#xff1a; 题目描述 学校有n台计算机&#xff0c;为了方便数据传输&#xff0c;现要将它们用数据线连接起来。两台计算机被连接是指它们之间有数据线连接。由于计算机所处的位置不同&#xff0c;因此不同…

P5304-[GXOI/GZOI2019]旅行者【最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P5304 题目大意 nnn个点mmm条边的一张有向图&#xff0c;有kkk个关键点&#xff0c;求距离最短的一对关键点。 解题思路 我们能够O(nlog⁡n)O(n\log n)O(nlogn)的进行一个起点或多个起点同时的最短路&#xff0c;但是这题显然…

微软宣布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 的…

P2710-数列【Splay】

正题 题目链接:https://www.luogu.com.cn/problem/P2710 题目大意 nnn个数&#xff0c;mmm次操作要求支持 插入若干个数删除某个位置开始的连续若干个数翻转一个区间修改一个区间为ttt求区间和输出一个位置的值询问一个区间的最大子段和 解题思路 用SplaySplaySplay维护&…

【并查集】【图论】【最小生成树】剑鱼行动(ssl 1618)

剑鱼行动 ssl 1618 题目大意&#xff1a; 求一个平面直角坐标系中的最小生成树 原题&#xff1a; 题目描述 给出N个点的坐标&#xff0c;对它们建立一个最小生成树&#xff0c;代价就是连接它们的路径的长度&#xff0c;现要求总长度最小。N的值在100以内&#xff0c;坐标…

图像处理作业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…

【二进制】17倍

17倍 题目大意&#xff1a; 有一个二进制数&#xff0c;求它的17倍 原题: 题目描述&#xff1a; 在了解做软件开发可能赚很多的钱之后&#xff0c;农夫约翰也开了一家小的软件公司为客户写程序。约翰的第一个任务对他来说看起来相当简单&#xff1a;输入一个数N&#xff0…

图像处理作业第五次

第5次图像处理作业 1. 复习理解课本中最佳陷波滤波器进行图像恢复的过程&#xff0c;请推导出w(x,y)最优解的计算过程. 根据公式: σ21(2a1)(2b1)∑∑[g−wη−(gˉ−wηˉ)]2\sigma ^2 \frac{1}{(2a1)(2b1)}\sum\sum[g-w\eta - (\bar g-w\bar\eta)]^2σ2(2a1)(2b1)1​∑∑[g…

2020牛客国庆集训派对day8G-Shuffle Cards【Splay】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7865/G 题目大意 nnn个数从1∼n1\sim n1∼n&#xff0c;mmm次拿出其中一段放到头部&#xff0c;求最终序列。 解题思路 用SplaySplaySplay拿出一段区间然后丢到头部就好了。 时间复杂度O(nlog⁡n)O(n\log n)O(nlogn) cod…

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

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

图像处理作业 第8次

图像处理作业 第8次 7.11 说明尺度函数ϕ(x)1,0.25≤x<0.75\phi(x)1 ,0.25 \le x\lt 0.75ϕ(x)1,0.25≤x<0.75并未满足多分辨率分析的第二个要求. ϕ1,0(x)2ϕ(2x)1\phi_{1,0}(x)\sqrt 2 \phi(2x)1ϕ1,0​(x)2​ϕ(2x)1 当且仅当满足0.125≤x<0.3750.125 \le x\lt 0…

【dfs】马蹄印

马蹄印 题目大意&#xff1a; 有一个只含括号的图&#xff0c;要你走一条路&#xff08;从左上角出发&#xff09;&#xff0c;使你走的路上的括号加在一起是先k个左括号再k个右括号组成的&#xff0c;要求k最大 原题&#xff1a; 题目描述&#xff1a; 虽然当奶牛贝里斯找…

P4852-yyf hates choukapai【单调队列优化dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4852 题目大意 给出n,m,c,dn,m,c,dn,m,c,d&#xff0c;有n∗cmn*cmn∗cm张卡牌。进行nnn次连抽mmm次单抽&#xff0c;连抽连续ccc张卡牌会获得第一张卡牌的欧气值&#xff0c;单抽可以获得抽到卡牌的欧气值。不能连续进行dd…