/// <summary> /// 配置了HTTP请求的管道,每当一个HTTP请求到达之后,Configure方法里面的组件将决定 /// 我们如何响应HTTP请求 /// </summary> /// <param name="app"></param> /// <param name="env"></param> /// <param name="configuration"></param> public void Configure( IApplicationBuilder app, IHostingEnvironment env, /** * 在方法的参数中,添加了IConfiguration接口 * 相当于请求实现了IConfiguration接口的对象所对应的服务 * 为什么可以在方法的参数中直接请求实现了IConfiguration接口的对象呢? * 因为ASP.Net Core使用依赖注入,在整个应用几乎所有的地方都可以使用依赖注入 * 原理: * 当web程序调用Configure方法的时候,ASP.Net Core会分析方法的参数 * 当前方法请求了三个参数app,env,configuration * 如果ASP.Net Core能自动解析这些参数的话,ASP.Net Core会自动把实现了 * 该接口的对象(服务)传递到此处,供方法中进行调用 * **/ // IConfiguration configuration // 使用我们自己定义的接口,我们自己定义的接口需要通过IServiceCollection接口手动注入到容器当中 IWelComeService welComeService, // 导入日志接口,因为AspNetCore已经把这个类注入好了,因此我们可以无需注册就直接使用 ILogger <Startup> logger ) { /** * 如果当前是开发模式,就启用异常页, * 如果不启用该页的话,就会返回一个500的异常状态码 * **/ if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { // 如果非开发模式的话,走下面这个中间件 app.UseExceptionHandler(); } /** * app.Use()是一种比较底层的调用中间件的方法 * 在程序执行的时候,app.Use只会执行一次, * 但是在该方法中return后面的部分才是中间件, * 中间件方法会执行多次 * **/ app.Use(next => { logger.LogInformation("app.Use()....."); return(async httpContext => { logger.LogInformation("---async httpContext"); // 当请求以/first开头的时候就会返回到页面"First!!!"字符串 if (httpContext.Request.Path.StartsWithSegments("/first")) { logger.LogInformation("---First!!!"); await httpContext.Response.WriteAsync("First!!!"); } else { logger.LogInformation("next(httpContext)"); // 否则就继续执行下面的中间件 await next(httpContext); } }); }); /** * 在真实的项目中我们一般使用.UseXXX()开头的中间件 * app.UseWelcomePage(): 启用欢迎页 * 1. 默认的配置是收到任何请求都会显示这个欢迎页,后面的中间件就不再执行了 * 2. 但是我们对UseWelcomePage方法进行了配置,只有当URL是"/welcome"的时候才会显示该中间件 * 否则就继续执行后面的中间件 * **/ app.UseWelcomePage(new WelcomePageOptions { Path = "/welcome" }); /** * 这个中间件的作用相当于UseDefaultFiles()和UseStaticFiles() * **/ // app.UseFileServer(); /** * 启用默认文件中间件,默认是wwwroot文件夹 * **/ //app.UseDefaultFiles(); /** * 启用静态文件中间件 * **/ app.UseStaticFiles(); /** * 使用默认路由的MVC,该MVC会有默认的路由配置规则 * 当访问项目根路径的时候会找到HomeController类中的Index方法 * **/ // app.UseMvcWithDefaultRoute(); // 由于我们把.UseMvc()中的方法给注释掉了,因此需要手动在Controller类和方法中手动配置路由 app.UseMvc(builder => { /** * 当我们访问 /Home/Index/3 的时候,会通过下面的路由配置 * 找到HomeController类中的Index()方法 * {controller}/{action}/{id?}中的id?代表id是可选的 * **/ // builder.MapRoute("Default", "{controller}/{action}/{id?}"); // 给路由设置默认值,如果我们访问项目的根路径的话,就会默认访问/Home/Index // builder.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}"); /** * 上面这两种方式要求路由的名称和类名称和方法名要对应起来 * 我们还可以像java中在类上添加路由标签的方式来实现路由的配置 * **/ }); /** * 不管我们收到什么样的HTTP请求,我们都会返回下面的响应 * 在真实的项目中一般很少使用.run()方法,该方法一般都配置简单的中间件 * **/ app.Run(async(context) => { /** * 从配置文件中读取配置信息 * 获取配置信息有优先级,同名的情况下,先加载的会被后加载的给覆盖掉 * 1. appsettings.json (最先加载) * 2. appsettings.Development.json * 3. User Secrets * 4. 环境变量 * 5. 命令行参数(最后加载) * **/ // var welcomeInfo = configuration["Welcome"]; var welcomeInfo = welComeService.GetMessage(); await context.Response.WriteAsync(welcomeInfo); }); }
/// <summary> /// 配置了HTTP请求的管道,每当一个HTTP请求到达之后,Configure方法里面的组件将决定 /// 我们如何响应HTTP请求 /// </summary> /// <param name="app"></param> /// <param name="env"></param> /// <param name="configuration"></param> public void Configure( IApplicationBuilder app, IHostingEnvironment env, // 使用我们自己定义的接口,我们自己定义的接口需要通过IServiceCollection接口手动注入到容器当中 IWelComeService welComeService, // 导入日志接口,因为AspNetCore已经把这个类注入好了,因此我们可以无需注册就直接使用 ILogger <Startup> logger ) { /** * 如果当前是开发模式,就启用异常页, * 如果不启用该页的话,就会返回一个500的异常状态码 * **/ if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { // 如果非开发模式的话,走下面这个中间件 app.UseExceptionHandler(); } app.Use(next => { logger.LogInformation("app.Use()....."); return(async httpContext => { logger.LogInformation("---async httpContext"); // 当请求以/first开头的时候就会返回到页面"First!!!"字符串 if (httpContext.Request.Path.StartsWithSegments("/first")) { logger.LogInformation("---First!!!"); await httpContext.Response.WriteAsync("First!!!"); } else { logger.LogInformation("next(httpContext)"); // 否则就继续执行下面的中间件 await next(httpContext); } }); }); app.UseWelcomePage(new WelcomePageOptions { Path = "/welcome" }); /** * 启用静态文件中间件 * **/ app.UseStaticFiles(); /** * 以/node_modules开头的请求,中间件会进行处理,可以访问到我们安装的第三方库 * **/ app.UseStaticFiles(new StaticFileOptions { RequestPath = "/node_modules", // 通过项目的路径来获取/node_modules的路径 FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "node_modules")) }); // 由于我们把.UseMvc()中的方法给注释掉了,因此需要手动在Controller类和方法中手动配置路由 app.UseMvc(builder => { }); /** * 不管我们收到什么样的HTTP请求,我们都会返回下面的响应 * 在真实的项目中一般很少使用.run()方法,该方法一般都配置简单的中间件 * **/ app.Run(async(context) => { var welcomeInfo = welComeService.GetMessage(); await context.Response.WriteAsync(welcomeInfo); }); }