继续用上次修改后的Configure方法为例
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IWelcomeSeriver welcomeSeriver)//还可以自定义接口,,依赖注入,注意自定义的接口必须注册,不然找不到 { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.Run(async (context) => { string welcome = welcomeSeriver.GetWelcomeMessage();//这里获取配置文件的优先级应该是,命令行>系统变量>开发环境配置文件>配置文件 await context.Response.WriteAsync(welcome); }); }
在实际项目中,很少使用app.Run方法,一般这个方法里只配置简单的中间件。
----------------------------------------------------------------------------------------------------------------------------
通常使用,app.UseXXXX的方法,而相应的方法也通常都把实现封装起来了,用起来也挺方便。
例如 app.UseWelcomePage(); 代码执行到它,就截断返回一个欢迎页,也可以设置欢迎页的路由。
app.UseWelcomePage(new WelcomePageOptions { Path = "/MyWelcome" });
访问 localhost:xxxx/MyWelcome时,返回一个欢迎页。
--------------------------------------------------------------------------------------------------------------------------------
也可以直接使用app.Use(),这里写个例子
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IConfiguration configuration) { //if (env.IsDevelopment()) //{ // app.UseDeveloperExceptionPage(); //} //next是一个RequestDelegate对象,代表的是管道里的下一个中间件 app.Use(next => { return async httpContext => { string str = httpContext.Request.Path; //如果路径中有login,就返回login pls! if (str.ToLower().Contains("login")) { await httpContext.Response.WriteAsync("login pls!"); } //如果没有,就执行下一个中间件 else { await next(httpContext); } }; }); //如果路径是 /MyWelcome,就返回欢迎页,不是,下一个 app.UseWelcomePage(new WelcomePageOptions { Path = "/MyWelcome" }); //如果能执行到这,就从配置文件中读取DefaultWords节点输出出来 app.Run(async (context) => { string str = configuration["DefaultWords"]; await context.Response.WriteAsync(str); }); }
这里也可以看出,多个中间件是按顺序执行的(如果没被中断的话)