Intern Day4 - 中间件
时间:2021-02-23
本文章向大家介绍Intern Day4 - 中间件,主要包括Intern Day4 - 中间件使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
学习大纲和要点
-
需要学会:大概原理、怎么用、怎么实现/创建
-
两个最基本职责:
-
选择是否将请求传递给管道中的下一个中间件。也可以直接响应,但是会造成管道的短路。
- 短路:指结束请求并开始响应,是一种机制,是非常有必要的一种手段,可以避免很多不必要的工作。使得HTTP的请求很好的被层层处理,层次清晰。
- 短路:指结束请求并开始响应,是一种机制,是非常有必要的一种手段,可以避免很多不必要的工作。使得HTTP的请求很好的被层层处理,层次清晰。
-
在管道中的下一个中间件的前后执行工作(执行请求->、响应<-)。
-
-
中间件的顺序:管道里的中间件是有顺序的,就是我们的代码顺序。
-
ASP.NET Core内置了一个依赖注入框架(该框架就是利用了一个服务容器,来提供管道在构建以及请求过程中所需要的服务),添加内置中间件。
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; }
// 这个方法用于处理中间件/配置服务,在时候被执行
// 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\n"); // 请求处理
await next(); // 指向了下一个中间件 (可以理解为把中间件串起来),就是一个异步委托
// use和run都向管道里添加了一个中间件。
// 如果没有这句话,相当于直接终结了,管道会短路,那么run不会执行了
await context.Response.WriteAsync("Middleware 1 End\n");//响应
});
app.Use(async (context, _) => //如果不用到next的话,next部分可以用 _ 代替
{
await context.Response.WriteAsync("Middleware 2 Begin\n");
await context.Response.WriteAsync("Middleware 2 End\n");
});
// 注册自定义中间件:我们可以自己写一个类,这个类就是中间件类。并且还为我们的中间件类提供了依赖注册的功能
app.UseMiddleware<>();
// 添加一个终端/终结点中间件中间件委托到管道,()里面接受的是一个委托,这个委托就是我们的中间
// 但是一般不会这么写
app.Run(async context => //默认直接返回,回去的时候进行响应操作
//注意:响应是响应,返回是返回
{
// context.Request.
await context.Response.WriteAsync("Hello Run\n");
//在委托里写,调用上下文对象进行响应
// 因为这边直接响应了,所以下面的就不会再执行了
});
//这个中间件只做了一件事:在我们的响应里写上 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();
app.UseRouting(); // 路由中间件
app.UseAuthorization();
// 终端中间件
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
学习视频
https://www.bilibili.com/video/BV1r7411A7Z2?from=search&seid=9070934629069273158
原文地址:https://www.cnblogs.com/OFSHK/p/14437526.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- js canvas实现QQ拨打电话特效
- Spring boot部署发布到linux的操作方法
- Android 实现获取手机里面的所有图片详解及实例
- C++使用一个栈实现另一个栈的排序算法示例
- Android 实现自动打电话与发短信的实例
- Python遍历文件夹和读写文件的实现方法
- Angular.JS中指令的命名规则详解
- 微信小程序之购物车功能
- BootStrap的两种模态框方式
- C++ 中指针和引用有什么区别详解
- Android从图片获取二维码的方法
- Java使用NioSocket手动实现HTTP服务器
- JS实现队列的先进先出功能示例
- java Socket实现简单模拟HTTP服务器
- Angular.JS通过指令操作DOM的方法