ASP.Net Core是Microsoft提供的开源,跨平台,可扩展,精益和模块化的框架,可用于构建高性能的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应用程序(Model-View-Controller)”作为项目模板,以创建一个新的ASP.Net Core应用程序。
- 确保未选中“启用Docker支持”和“配置HTTPS”复选框,因为我们此处将不再使用这些功能。
- 确保将身份验证设置为“无身份验证”,因为我们也不会使用身份验证。
- 点击创建,
按照这些步骤应该在Visual Studio中创建一个新的ASP.Net Core项目。 我们将在本文的后续部分中使用该项目。
ASP.Net Core中的Use,Run和Map方法
Use,Map和Run方法用于在ASP.Net Core中配置HTTP管道。 以下是这些方法及其用途的简要介绍。
- 使用-此方法将执行委托,然后移至管道中的下一步。 Use方法也可以用于使管道短路。
- 运行-此方法将执行委托并返回结果。
- Map —此方法将有条件地执行委托并返回结果。
在ASP.Net Core中注册中间件
ASP.Net Core中的中间件组件已在Startup类的Configure方法中注册。 Use *扩展方法用于注册中间件。 这是注册中间件组件的语法。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMyCustomMiddleware<MyCustomMiddleware>();
}
应该注意的是,中间件组件是按照它们注册的顺序执行的。
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 <HttpContext,bool>谓词
- 委托行动
您可以在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谓词是true还是false。 让我们通过一个例子来理解这一点。 考虑以下代码:
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有条件地执行中间件。
-
在ASP.Net Core中了解有关中间件以及请求和响应处理的更多信息:
- 如何在ASP.Net Core中构建自定义中间件
- 如何提高ASP.Net Core的性能
- 如何在ASP.Net Core中使用响应缓存中间件
- 如何在ASP.Net Core中实施运行状况检查
- 如何在ASP.Net Core中实现全局异常处理
- 如何在ASP.Net Core MVC中使用动作筛选器
From: https://www.infoworld.com/article/3429602/how-to-use-conditional-middleware-in-aspnet-core.html