便宜的seo网站优化排名莆田网站建设培训
news/
2025/9/23 1:14:48/
文章来源:
便宜的seo网站优化排名,莆田网站建设培训,图片墙网站源码,法律建设网站21 | 中间件#xff1a;掌控请求处理过程的关键如果在 Map 的时候逻辑复杂一点#xff0c;不仅仅判断它的 URL 地址#xff0c;而且要做特殊的判断的话#xff0c;可以这么做把判断逻辑变成一个委托我们要判断当我们的请求地址包含 abc 的时候#xff0c;输出 new abcapp.… 21 | 中间件掌控请求处理过程的关键如果在 Map 的时候逻辑复杂一点不仅仅判断它的 URL 地址而且要做特殊的判断的话可以这么做把判断逻辑变成一个委托我们要判断当我们的请求地址包含 abc 的时候输出 new abcapp.MapWhen(context
{return context.Request.Query.Keys.Contains(abc);
}, builder
{builder.Run(async context {await context.Response.WriteAsync(new abc);});
});启动程序没有任何输出当我们在默认启动地址后面输入 ?abc1 的时候可以看到输出了 new abc这里用到了一个 Run 的方法上一节用到的是 Use 方法app.Map(/abc, abcBuilder
{abcBuilder.Use(async (context, next) {//await context.Response.WriteAsync(Hello);await next();await context.Response.WriteAsync(Hello2);});
});Run 和 Use 的区别是什么呢Use 是指我们可以像注册一个完整的中间件一样将 next 注入进来我们可以去决定是否执行后续的中间件Run 的含义就表示我们这里就是中间件执行的末端也就不在执行后面的中间件了在这里将返回请求那我们如何像 UseRouting UseEndpoints 一样来设计我们自己的中间件呢这里定义好了一个 MyMiddlewarenamespace MiddlewareDemo.Middlewares
{class MyMiddleware{RequestDelegate _next;ILogger _logger;public MyMiddleware(RequestDelegate next, ILoggerMyMiddleware logger){_next next;_logger logger;}public async Task InvokeAsync(HttpContext context){using (_logger.BeginScope(TraceIdentifier:{TraceIdentifier}, context.TraceIdentifier)){_logger.LogDebug(开始执行);await _next(context);_logger.LogDebug(执行结束);}}}
}定义中间件是用了一个约定的方式中间件的类包含一个方法 Invoke 或者 InvokeAsync 这样一个方法它的返回是一个 Task入参是一个 HttpContext实际上可以理解成与中间件的委托是一样的只要我们的类包含这样一个方法就可以把它作为一个中间件注册进去并被框架识别到这里还定义了一个 MyBuilderExtensionsnamespace Microsoft.AspNetCore.Builder
{public static class MyBuilderExtensions{public static IApplicationBuilder UseMyMiddleware(this IApplicationBuilder app){return app.UseMiddlewareMyMiddleware();}}
}把我们的中间件注册进去这个方法就是 UseMyMiddleware通过这样的定义我们就可以使用自己的中间件app.UseMyMiddleware();启动程序输出如下控制台输出dbug: MiddlewareDemo.Middlewares.MyMiddleware[0] RequestPath:/weatherforecast RequestId:0HLU50UEM3M9F:00000001, SpanId:|77f92fe8-4a6d800968327989., TraceId:77f92fe8-4a6d800968327989, ParentId: TraceIdentifier:0HLU50UEM3M9F:00000001开始执行
dbug: MiddlewareDemo.Middlewares.MyMiddleware[0] RequestPath:/weatherforecast RequestId:0HLU50UEM3M9F:00000001, SpanId:|77f92fe8-4a6d800968327989., TraceId:77f92fe8-4a6d800968327989, ParentId: TraceIdentifier:0HLU50UEM3M9F:00000001执行结束网页控制器输出[{date:2020-03-11T23:30:55.341169608:00,temperatureC:20,temperatureF:67,summary:Warm},{date:2020-03-12T23:30:55.341786308:00,temperatureC:52,temperatureF:125,summary:Bracing},{date:2020-03-13T23:30:55.341791608:00,temperatureC:-3,temperatureF:27,summary:Mild},{date:2020-03-14T23:30:55.34179208:00,temperatureC:35,temperatureF:94,summary:Balmy},{date:2020-03-15T23:30:55.341792308:00,temperatureC:37,temperatureF:98,summary:Sweltering}]Hello2如果要实现一个断路器就是不执行后续逻辑注释掉一行_logger.LogDebug(开始执行);//await _next(context);_logger.LogDebug(执行结束);启动程序页面不会输出任何内容只会在控制台打印出中间件的执行过程后续的控制器不会执行这样就实现了一个断路器也就意味着可以使用自己的中间件做请求的控制而且时非常灵活的控制在使用中间件的过程中需要非常注意的是注册中间件的顺序这些顺序就决定了中间件执行的时机某些中间件会是断路器的作用某些中间件会做一些请求内容的处理还有一个比较关键的要点是指应用程序一旦开始向 Response write 的时候后续的中间件就不能再去操作它的 header这一点是需要注意的可以通过 Context.Response.HasStarted 来判断是否已经开始向响应的 body 输出内容一旦输出了内容就不要再操作 header
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910971.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!