【51CTO.com快译】ASP.Net Core是微软的一种开源跨平台框架,具有可扩展、精简化和模块化的优点,可用于构建高性能Web应用程序。中间件组件可以用在ASP.Net Core请求管道中,定制处理请求和响应的方式。
ASP.Net Core中间件组件还可用于检查、路由或修改流经管道的请求和响应消息。本文讨论了如何用ASP.Net Core中的中间件执行一些高级操作。
创建ASP.Net Core MVC项目
首先,不妨在Visual Studio中创建一个ASP.Net Core项目。假设你的系统中已安装Visual Studio 2017或Visual Studio 2019,按照下列步骤,在Visual Studio中创建一个新的ASP.Net Core项目。
- 启动Visual Studio IDE。
- 点击“创建新项目”。
- 在“创建新项目”窗口中,从显示的模板列表中选择“ASP.Net Core Web应用程序”。
- 点击“下一步”。
- 在“配置新项目”窗口中,指定新项目的名称和位置。
- 点击“创建”。
- 在接下来显示的“创建新的ASP.Net Core Web应用程序”中,从顶部的下拉列表中选择.Net Core作为运行时环境和ASP.Net Core 2.2(或更高版本)。
- 选择“Web应用程序(模型-视图-控制器)”作为项目模板,创建一个新的ASP.Net Core应用程序。
- 确保“启用Docker支持”和“针对HTTPS的配置”复选框未勾选,因为我们在此处不会使用那些功能。
- 确保身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
- 点击“创建”。
遵循这些步骤应该可以在Visual Studio中创建一个新的ASP.Net Core项目。我们将在本文的后续部分中使用该项目。
ASP.Net Core中的Use、Run和Map等方法
Use、Map和Run等方法用于在ASP.Net Core中配置HTTP管道。下面简要介绍这每个方法及用途。
- Use——该方法将执行委托(delegate),然后进入到管道中的下一步。Use方法还可用于使管道短路。
- Run——该方法将执行委托并返回结果。
- Map——该方法将有条件地执行委托并返回结果。
ASP.Net Core中注册中间件
ASP.Net Core中的中间件组件在Startup类的Configure方法中注册。Use *扩展方法用于注册中间件。下面是注册中间件组件的语法。
- public void Configure(IApplicationBuilder app, IHostingEnvironment env)
- {
- app.UseMyCustomMiddleware();
- }
值得一提的是,中间件组件按它们注册的顺序来加以执行。
ASP.Net Core中的Invoke方法
每个中间件组件都包含一个Invoke方法。该方法接受对HttpContext实例的引用作为实参。中间件组件可以在调用下一个中间件组件前后执行操作。下面是典型的Invoke方法的示例:
- public async Task Invoke(HttpContext context)
- {
- // Write code here that will be executed before the
- // next middleware is called
- await _next.Invoke(context); // call next middleware
- // Write code here that will be executed after the
- //next middleware is called
- }
ASP.Net Core中使HTTP管道分支
Map扩展方法(即Map和MapWhen)用于使管道分支。Map用于基于特定的请求路径来分支,而MapWhen用于基于特定断言的结果来分支。
下列代码片段表明了Map方法如何用于使请求管道分支。
- public class Startup
- {
- private static void MapRequestA(IApplicationBuilder app)
- {
- app.Run(async context =>
- {
- await context.Response.WriteAsync("This is MapRequestA");
- });
- }
- private static void MapRequestB(IApplicationBuilder app)
- {
- app.Run(async context =>
- {
- await context.Response.WriteAsync("This is MapRequestB");
- });
- }
- private static void MapRequestC(IApplicationBuilder app)
- {
- app.Run(async context =>
- {
- await context.Response.WriteAsync("This is MapRequestC");
- });
- }
- public void Configure(IApplicationBuilder app)
- {
- app.Map("/mapRequestPathA", MapRequestA);
- app.Map("/mapRequestPathB", MapRequestB);
- app.Map("/mapRequestPathB", MapRequestC);
- app.Run(async context =>
- {
- await context.Response.WriteAsync("Hello World!");
- });
- }
- //Other methods
- }
MapWhen方法接受两个参数:
- Func
- 委托操作
你可以在Startup类的Configure方法中使用下列代码片段,不允许内容类型“text/html”。
- public void Configure(IApplicationBuilder app, IHostingEnvironment env)
- {
- if (env.IsDevelopment())
- {
- app.UseDeveloperExceptionPage();
- }
- app.MapWhen(context => context.Request.ContentType.Equals
- ("text/xml", StringComparison.InvariantCultureIgnoreCase),
- (IApplicationBuilder applicationBuilder) =>
- {
- applicationBuilder.Run(async context =>
- {
- await Task.FromResult(context.Response.StatusCode = StatusCodes.Status406NotAcceptable);
- });
- });
- app.UseMvc();
- }
ASP.Net Core中的UseWhen方法
UseWhen方法可用于有条件地执行中间件。下列代码片段表明了如果请求路径以“/api”开头,UseWhen方法如何用于执行中间件组件。
- app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), applicationBuilder =>
- {
- applicationBuilder.UseCustomMiddleware();
- });
请注意:与MapWhen不同,UseWhen方法继续执行后一个中间件,不管UseWhen断言是真还是假。不妨通过示例了解这一点。考虑下面这部分代码:
- app.UseMiddlewareA();
- app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), applicationBuilder =>
- {
- applicationBuilder.UseMiddlewareB();
- });
- app.UseMiddlewareC();
如果中间件没有短路,中间件A和C将始终执行。只有请求路径以“/api”开关,中间件B才会执行。
在ASP.Net Core中,请求处理管道中有一连串中间件组件。所有请求和响应都流经该管道。新请求进入后,这些中间件组件或处理请求,或将请求传递到管道中的下一个组件。想完成更复杂的请求处理,我们可以使用Map和MapWhen方法使管道分支,使用UseWhen有条件地执行中间件。
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】