什么是中间件(请求委托)?
中间件是一种装配到应用程序管道以处理请求和响应的软件。 每个组件:
选择是否将请求传递到管道中的下一个组件。
可在调用管道中的下一个组件前后执行工作。
使用 IApplicationBuilder 创建中间件管道
ASP.NET Core 请求管道包含一系列相继调用的请求委托,如下图所示(执行过程遵循黑色箭头):

每个委托均可在下一个委托前后执行操作。
此外,委托还可以决定不将请求传递给下一个委托, next 参数表示管道中的下一个委托。
public class Startup {
public void Configure (IApplicationBuilder app) {
// 添加一个中间件
app.Use (async (context, next) => {
// Do work that doesn't write to the Response.
await next.Invoke ();
// Do logging or other work that doesn't write to the Response.
});
// Run 是终点中间件
app.Run (async context => {
// 写入响应
await context.Response.WriteAsync ("Hello from 2nd delegate.");
});
}
}
中间件排序
中间件的添加顺序就是中间件的执行顺序
public void Configure(IApplicationBuilder app)
{
app.UseExceptionHandler("/Home/Error");
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvcWithDefaultRoute();
}
在以上代码中,UseExceptionHandler 是添加到管道的第一个中间件组件,因此,该组件可捕获在后面的调用中发生的任何异常。
Use、Run 和 Map
使用 Use、Run 和 Map 配置 HTTP 管道
Use 方法可使管道短路(即不调用 next 请求委托)
Run 添加一个中间件
Map 将请求路径映射到新的请求管道上面
MapWhen 基于给定谓词的结果将请求分发到新的请求管道上。
public class Startup
{
private static void HandleMapTest1(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("Map Test 1");
});
}
private static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context =>
{
var branchVer = context.Request.Query["branch"];
await context.Response.WriteAsync($"Branch used = {branchVer}");
});
}
public void Configure(IApplicationBuilder app)
{
// 如果请求是 /map1,则执行 HandleMapTest1
app.Map("/map1", HandleMapTest1);
// 如果请求参数包含 "branch",则执行 HandleBranch
app.MapWhen(context => context.Request.Query.ContainsKey("branch"),
HandleBranch);
app.Run(async context =>
{
await context.Response.WriteAsync("Hello from non-Map delegate. <p>");
});
}
}
Map 支持嵌套,例如:
app.Map ("/level1", level1App => {
level1App.Map ("/level2a", level2AApp => {
// "/level1/level2a"
//...
});
level1App.Map ("/level2b", level2BApp => {
// "/level1/level2b"
//...
});
});
像使用UseMvc一样添加中间件
定义中间件类(注:中间件按照约定定义,并没有继承任何接口):
public class RequestCultureMiddleware {
private readonly RequestDelegate _next;
public RequestCultureMiddleware (RequestDelegate next) {
_next = next;
}
public async Task InvokeAsync (HttpContext context) {
...
await _next (context);
}
}
扩展 IApplicationBuilder 的方法:
public static class RequestCultureMiddlewareExtensions
{
public static IApplicationBuilder UseRequestCulture (
this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestCultureMiddleware> ();
}
}
调用扩展方法:
public void Configure (IApplicationBuilder app)
{
app.UseRequestCulture ();
...
}
本文详细介绍了中间件在ASP.NET Core中的作用及其在请求管道中的应用方式。中间件作为处理请求和响应的组件,可以按顺序执行并决定是否传递请求到下一个组件。文章通过示例代码解释了如何使用Use、Run和Map方法配置HTTP管道,以及如何自定义中间件。
869

被折叠的 条评论
为什么被折叠?



