zoukankan      html  css  js  c++  java
  • Intern Day6

    • 两个最基本职责:

      1. 选择是否将请求传递给管道中的下一个中间件。也可以直接响应,但是会造成管道的短路。

        • 短路:指结束请求并开始响应,是一种机制,是非常有必要的一种手段,可以避免很多不必要的工作。使得HTTP的请求很好的被层层处理,层次清晰。
      2. 在管道中的下一个中间件的前后执行工作(执行请求->、响应<-)。

    • 中间件的顺序:管道里的中间件是有顺序的,就是我们的代码顺序。

    • ASP.NET Core内置了一个依赖注入框架(该框架就是利用了一个服务容器,来提供管道在构建以及请求过程中所需要的服务),添加内置中间件。

    • 你编写的WEB应用,实际上就是在写中间件,全都是中间件;你写的控制器,也是中间件里的一部分。

    • 中间件所依赖的类,都可以通过服务容器注入进来。

    • 一切能促使管道短路的就叫 终结点 或 终端中间件 。

    • 这些中间件的内部,不是调用use,就是调用run。所以要会use和run的使用。

    • 一个中间件实际上就是一个类。

    Startup.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.HttpsPolicy;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.EntityFrameworkCore;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    using Microsoft.OpenApi.Models;
    using WebApplication3.Model;
    
    namespace WebApplication3
    {
        public class Startup
        {
            public Startup(IConfiguration configuration)
            {
                Configuration = configuration;
            }
    
            // IConfiguration 程序配置接口,用来读取文件和内存中的配置
            public IConfiguration Configuration { get; }
    
    
            // ******配置服务(可选的),下面那个configure(必写的)是配置管道的******
            //  以依赖注入的方式将服务(实际上就是一个类)添加到服务(IOC)容器
            // 这个方法用于处理中间件/配置服务,在时候被执行
            // IServiceCollection服务配置接口,用来配置常用服务及依赖注入
            public void ConfigureServices(IServiceCollection services) // 注入
            {
                // 添加
                services.AddDbContext<TodoContext>(options => options.UseInMemoryDatabase("tododb")); 
                // service这个容器里面注入dbcontext,传入一个 tododb 字符串
                //MemoryDatabase内存数据库:微软通过内存模拟了一个secseray,允许dbcontext访问,可以更换成pgsql等,这行代码表示可以往这个数据库里添加数据
                
                services.AddControllers();  
                services.AddSwaggerGen(c =>
                {
                    c.SwaggerDoc("v1", new OpenApiInfo {Title = "WebApplication3", Version = "v1"});
                });
            }
    
    
            // ******配置管道的******
            // IApplicationBuilder应用配置接口,用来配置中间件,所有的中间件都写在这个下面
            // IWebHostEnvironment主机环境,用于不同环境不同处理
            // 中间件本质其实就是一堆委托
            // 我们不会在这里直接use、run使用他们,这里使用是为了方便理解
            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                
                // 第一个泛型参数是传入的,第二个是返回值类型next(指向的是管道中的下一个中间件)
                app.Use(async (context, next) =>
                {
                    await context.Response.WriteAsync("Middleware 1 Begin
    "); // 请求处理
                    await next(); // 指向了下一个中间件 (可以理解为把中间件串起来),就是一个异步委托
                                  // use和run都向管道里添加了一个中间件。
                                  // 如果没有这句话,相当于直接终结了,管道会短路,那么run不会执行了
                    await context.Response.WriteAsync("Middleware 1 End
    ");//响应
                });
                
                app.Use(async (context, _) => //如果不用到next的话,next部分可以用 _ 代替
                {
                    await context.Response.WriteAsync("Middleware 2 Begin
    ");
                    await context.Response.WriteAsync("Middleware 2 End
    ");
                });
    
                // 注册自定义中间件:我们可以自己写一个类,这个类就是中间件类。并且还为我们的中间件类提供了依赖注册的功能
                //app.UseMiddleware<>();
                
                // 添加一个终端/终结点中间件中间件委托到管道,()里面接受的是一个委托,这个委托就是我们的中间
                // 但是一般不会这么写
                app.Run(async context =>  //默认直接返回,回去的时候进行响应操作
                //注意:响应是响应,返回是返回
                {
                    // context.Request.
                    await context.Response.WriteAsync("Hello Run
    ");
                    //在委托里写,调用上下文对象进行响应
                    // 因为这边直接响应了,所以下面的就不会再执行了
                }); 
                //这个中间件只做了一件事:在我们的响应里写上 Hello Run 这句话
                
                
                /*
                    以上三个中间件执行完后输出:
                    Middleware 1 Begin 
                    Middleware 2 Begin
                    Middleware 2 End
                    Middleware 1 End
                */
                
                //以下都是默认的
                
                //第一个中间件
                //这个方法用于处理HTTP请求的管道(如路由等)
                if (env.IsDevelopment()) // 判断是不是一个开发模式
                {
                    app.UseDeveloperExceptionPage();//提供了一个开发人员异常页面中间件(即捕捉异常的代码在最前面)
                    app.UseSwagger();
                    app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApplication3 v1"));
                }
    
                app.UseHttpsRedirection(); 
                
              //下面这两个中间件是一起用的,不可分割,在ASP.NET Core 2.x里面,这俩是一个路由中间件,在3.0的时候路由中间件拆成两部分。
    
                app.UseRouting(); // 终端路由中间件,用来识别路由、匹配路由和终结点的//这个路由是通用的(不管是API还是MVC还是xxx),下面可能就不通用了,因为配置不一样
    
                app.UseAuthorization();
    
                // 终端/终结点中间件,用来配置路由和终结点之间的映射关系
                // 终结点,可以视为应用程序提供针对HTTP请求的处理器
                // MVC应用/Web API,终结点对应控制器中的某个方法
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                });
            }
        }
    }
    

    学习视频

    https://www.bilibili.com/video/BV1r7411A7Z2?from=search&seid=9070934629069273158

  • 相关阅读:
    hdu3487 Play with Chain
    poj3481
    [HNOI2002]营业额统计
    poj3468 A Simple Problem with Integers
    [NOI2004]郁闷的出纳员
    UVa1308 LA2572
    20130620
    poj3580
    20130618
    C++类模版学习笔记
  • 原文地址:https://www.cnblogs.com/OFSHK/p/14437526.html
Copyright © 2011-2022 走看看