北邮李伊娜,梅花拳,切尔西vs曼联直播吧
在本节中,我们将讨论使用中间件组件为 asp.net core 应用程序配置请求处理管道。
作为应用程序启动的一部分,我们要在configure()
方法中设置请求处理管道。
public class startup { public void configureservices(iservicecollection services) { } public void configure(iapplicationbuilder app, ihostingenvironment env) { if (env.isdevelopment()) { app.usedeveloperexceptionpage(); } app.run(async (context) => { await context.response.writeasync("hello world!"); }); } }
目前我们的代码中有 2 个中间件在管道中 :usedeveloperexceptionpage()方法和run()方法
usedeveloperexceptionpage 中间件:顾名思义,如果存在异常并且环境是development
,此中间件会被调用,显示开发异常页面。 我们将在后面的视频中讨论这个developerexceptionpage 中间件和环境变量的使用。
第二个中间件是注册run()
方法到管道中,它只能处理将一个信息传入response
对象。 目前,它是一个响应每个请求的中间件,返回 hello world。 在这种情况下,无论您的请求路径是什么。 所有请求都会被这个中间件所处理,我们得到的返回值都是这个中间件调用response
对象,返回的 string 类型的字符串。 返回的值是纯文本而不是 html。 我们可以通过检查页面源代码来确认这一点。 可以看到,我们在源代码中没有任何 html 标记。 只是纯文本。
即使您现在创建一个为52abp.html
的文件,并且您在请求中包含该文件的路径,我们的应用程序也无法返回该静态文件。 这是因为,目前我们的请求处理管道没有可以提供静态文件的中间件,如html文件,图像,css和javascript文件
。 在后面的课程中,我们将添加所需的中间件以便能够提供静态文件。
app.run(async (context) => { await context.response.writeasync("hello world!"); });
代码说明:
run()
方法是作为iapplicationbuilder
接口的扩展方法实现的。这就是我们能够在iapplicationbuilder
对象应用程序上调用此run()
方法的原因。run()
方法的参数是一个requestdelegate
,我们可以从智能提示中看到它。requestdelegate
是一个作为httpcontext
对象的参数委托。httpcontext
对象,中间件可以访问传入的 http 请求和传出的 http 响应。lambda
将请求,它通过委托内联的方式作为匿名方法传递,所以很多人都说 lambda 表达式是一种特殊的委托。如果你听不明白 lambda 表达式,委托,及内联,你可以参考学习:
run()
扩展方法,我们只能将一个终端中间件
添加到请求管道。终端中间件
是我们之前已经说到过,他会使管道短路,不会去调用下一个中间件。app.run(async (context) => { await context.response.writeasync("从第一个中间件中打印hello world"); }); app.run(async (context) => { await context.response.writeasync("从第二个中间件中打印hello world"); });
run()
方法注册了 2 个中间件。run()
方法注册的中间件无法调用管道中的下一个中间件。run()
方法注册的中间件是终端中间件
如果您希望中间件能够调用管道中的下一个中间件,则使用use()
方法注册中间件,如下所示。
app.use(async (context, next) => { await context.response.writeasync("从第一个中间件中打印hello world"); await next(); }); app.run(async (context) => { await context.response.writeasync("从第二个中间件中打印hello world"); });
注意,use()
方法有 2 个参数。第一个参数是httpcontext
上下文对象,第二个参数是func
类型,即它是代表管道中下一个中间件的通用委托。
public void configure(iapplicationbuilder app, ihostingenvironment env, ilogger<startup> logger) { app.use(async (context, next) => { logger.loginformation("mw1:传入请求"); await next(); logger.loginformation("mw1:传出响应"); }); app.use(async (context, next) => { logger.loginformation("mw2: 传入请求"); await next(); logger.loginformation("mw2: 传出响应"); }); app.run(async (context) => { await context.response.writeasync("mw3: 处理请求并生成响应"); logger.loginformation("mw3: 处理请求并生成响应"); }); }
ilogger < startup >
被注入到configure()
方法中main()
方法调用的createdefaultbuilder()
配置日志记录configurelogging()
,* 您会发现,ilogger 配置了console,debug和eventsource
三种.依赖注入
的方式将ilogger
记录到系统中。visual studio
运行项目,则可以在输出窗口中
查看记录的信息。从输出窗口的下拉列表中选择 asp.net core web server。现在将上面的输出与微软的官方文档中的下图集合起来,是不是就清晰明了啊。吐槽下,微软的文档有粗糙。
请记住,asp.net core 中的中间件可以访问传入请求和传出响应
请求先到达middleware1
,它记录**(mw1:传入请求)**,因此我们首先看到此消息。
然后middleware1
调用next()
。next()
会调用管道中的middleware2
。
middleware2
记录**(mw2:传入请求)**。
然后 middleware2
会调用next()
再调用 middleware3
.
middleware3
处理请求并生成响应。因此,我们看到的下一条消息是(mw3:处理请求并生成响应)
此时管道开始逆转。
此时控制权将,交回到middleware2
,并将middleware3
生成的响应传递给它。middleware2
记录**(mw2:传出响应)**,这是我们接下来看到的。
最后, middleware2
将控制权交给 midleware1
。
middleware1
记录 (mw1: 传出响应), 这是我们最后看到的。
请求
都会在每个中间件组件调用next()方法
之前触发。请求
按照图中箭头的所示方向,依次穿过所有管道。响应
都会在每个中间件组件调用next()方法
之前触发。响应
按照图中箭头的所示方向,依次穿过所有管道。response 为抽象类
乱码问题
context.response.contenttype = "text/plain; charset=utf-8";
欢迎添加个人微信号:like若所思。
欢迎关注我的公众号,不仅为你推荐最新的博文,还有更多惊喜和资源在等着你!一起学习共同进步!
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Blazor server side 自家的一些开源的, 实用型项目的进度之 CEF客户端
.NET IoC模式依赖反转(DIP)、控制反转(Ioc)、依赖注入(DI)
vue+.netcore可支持业务代码扩展的开发框架 VOL.Vue 2.0版本发布
网友评论