中间件是用于组成应用程序管道来处理请求和响应的组件。管道内的每一个组件都可以选择是否将请求交给下一个组件,并在管道中调用下一个组件之前和之后执行某些操作。请求委托被用来建立请求管道,请求委托处理每一个http请求。
请求委托通过使用IApplicationBuilder类型的Run、Map、以及Use扩展方法配置,并在Startup类中传给Configure方法。
个人理解:中间件就像http请求一个mvc路由然后程序就返回一个怎样响应,这写代码写在Configure方法里面。
例子一:无论页面怎么请求,就是返回Hello World!
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World!");
});
例子二:run方法会使得请求在管路中短路Hello World2不会执行。
app.Run(async context =>
{
await context.Response.WriteAsync("Hello,World");
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello,World2");//不会显示
});
例子三:next参数继续执行请求
loggerFactory.AddConsole(minLevel: LogLevel.Information);
var logger = loggerFactory.CreateLogger("Middleware");
app.Use(async (context, next) =>
{
logger.LogInformation("Handling request.");
await next.Invoke();
logger.LogInformation("Finished handling request");
});
app.Run(async context =>
{
await context.Response.WriteAsync("Hello,World");
});
例子四:,map方法:根据传入map方法的参数进行请求返回
app.Map("/maptest", HandleMapTest);//只有请求路径是maptest才会执行HandleMapTest委托
private void HandleMapTest(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("map test success");
});
}
例子五:mapwhen用于地址栏的querystring参数的试用
app.MapWhen(context =>
{
return context.Request.Query.ContainsKey("branch");
}, HandleBranch);
private static void HandleBranch(IApplicationBuilder app)
{
app.Run(async context =>
{
await context.Response.WriteAsync("brancb userd");
});
}
实战中间件demo,可以在此处下载