【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();
}
- 1.
- 2.
- 3.
- 4.
值得一提的是,中间件组件按它们注册的顺序来加以执行。
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
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
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
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
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();
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
ASP.Net Core中的UseWhen方法
UseWhen方法可用于有条件地执行中间件。下列代码片段表明了如果请求路径以“/api”开头,UseWhen方法如何用于执行中间件组件。
app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), applicationBuilder =>
{
applicationBuilder.UseCustomMiddleware();
});
- 1.
- 2.
- 3.
- 4.
请注意:与MapWhen不同,UseWhen方法继续执行后一个中间件,不管UseWhen断言是真还是假。不妨通过示例了解这一点。考虑下面这部分代码:
app.UseMiddlewareA();
app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), applicationBuilder =>
{
applicationBuilder.UseMiddlewareB();
});
app.UseMiddlewareC();
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
如果中间件没有短路,中间件A和C将始终执行。只有请求路径以“/api”开关,中间件B才会执行。
在ASP.Net Core中,请求处理管道中有一连串中间件组件。所有请求和响应都流经该管道。新请求进入后,这些中间件组件或处理请求,或将请求传递到管道中的下一个组件。想完成更复杂的请求处理,我们可以使用Map和MapWhen方法使管道分支,使用UseWhen有条件地执行中间件。
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】