.Net Core中间件

news2025/1/21 9:22:02

目录

一、什么是中间件

二、中间件的用途

三、中间件的三个概念

四、自定义中间件

五、ASP.NET Core附带中间件组件

六、中间件和过滤器的区别


一、什么是中间件

         在浏览网站或者使用手机App加载内容的时候,浏览器或者手机App其实在向Web服务器发送HTTP请求。服务器在收到HTTP请求后会对用户的请求进行一系列的处理,比如检查请求的身份验证信息、处理请求报文头、检查是否存在对应的服务器端响应缓存、找到和请求对应的控制器类中的操作方法等,当控制器类中的操作方法执行完成后,服务器也会对相应进行一系列处理,比如保存响应缓存、设置缓存报文头、设置CORS报文头、压缩响应内容等。这一系列操作如果全部都硬编码在ASP.NET Core中,会使代码耦合度太高,无法做到按需组装处理逻辑。因此基础框架只完成HTTP请求的调度、报文的解析等必要的工作,其他可选的工作都由不同的中间件来提供。 

 中间件指的是系统软件和应用软件之间连接的软件,以便于软件之间的沟通,这些中间件组成一个管道,整个ASP.NET Core的执行过程就是HTTP请求和响应按照中间件组装的顺序在中间件之间流转的过程。开发人员可以对组成管道的中间件按照需要进行自由组合,比如调整中间件的顺序、添加或者删除中间件、定义中间件等。

总结:

1.中间件是组装到应用程序管道中以处理请求和响应的软件。
2.每个组件选择是否将请求传递给管道中的下一个组件。
3.每个组件可以在调用管道中的下一个组件之前和之后执行工作。
4.请求委托(Request delegates)用于构建请求管道,处理每个HTTP请求。

二、中间件的用途

中间件的一个常见的场景,就是日志记录。中间件可以轻松地将请求(包括URL和路由)记录到日志系统中,以便以后进行分析。

中间件也是进行授权和身份验证、诊断、异常记录和处理的好地方。

简而言之,中间件可以用于那些不是特定于业务领域的逻辑,以及需要在每个请求或大多数请求中发生的操作。

三、中间件的三个概念

Map、Use、Run。

Map:用来定义一个管道可以处理哪些请求

Use和Run:用来定义管道,一个管道由若干个Use和一个Run组成,每个Use引入一个中间件,而Run用来执行最终的核心应用逻辑 

1、Run()方法中只有一个RequestDelegate委托类型的参数,没有Next参数,所以Run()方法也叫终端中间件,不会将请求传递给下一个中间件,也就是发生了“短路” 。

// Run方法向应用程序的请求管道中添加一个RequestDelegate委托
// 放在管道最后面,终端中间件
app.Run(handler: async context =>
{
    await context.Response.WriteAsync(text: "Hello World1\r\n");
});
app.Run(handler: async context =>
{
    await context.Response.WriteAsync(text: "Hello World2\r\n");
});

2、Use()方法的参数是一个Func委托,输入参数是一个RequestDelegate类型的委托,返回参数也是一个RequestDelegate类型的委托,这里表示调用下一个中间件

// 向应用程序的请求管道中添加一个Func委托,这个委托其实就是所谓的中间件。
// context参数是HttpContext,表示HTTP请求的上下文对象
// next参数表示管道中的下一个中间件委托,如果不调用next,则会使管道短路
// 用Use可以将多个中间件链接在一起
app.Use(async (context, next) =>
{
    await context.Response.WriteAsync(text: "hello Use1\r\n");
    // 调用下一个委托
    await next();
});
app.Use(async (context, next) =>
{
    await context.Response.WriteAsync(text: "hello Use2\r\n");
    // 调用下一个委托
    await next();
});

四、自定义中间件

      中间件遵循显示依赖原则,并在其构造函数中暴露所有依赖项。中间件能够利用UseMiddleware扩展方法的优势,直接通过它们的构造函数注入服务。依赖注入服务是自动完成填充的。

ASP.NET Core约定中间件类必须包括以下内容:

1、具有类型为RequestDelegate参数的公共构造函数。

2、必须有名为Invoke或InvokeAsync的公共方法,此方法必须满足两个条件:方法返回类型是Task、方法的第一个参数必须是HttpContext类型。

自定义一个记录IP的中间件,新建一个类RequestIPMiddleware

using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;
namespace MiddlewareDemo.Middleware
{
    /// <summary>
    /// 记录IP地址的中间件
    /// </summary>
    public class RequestIPMiddleware
    {
        // 私有字段
        private readonly RequestDelegate _next;
        /// <summary>
        /// 公共构造函数,参数是RequestDelegate类型
        /// 通过构造函数进行注入,依赖注入服务会自动完成注入
        /// </summary>
        /// <param name="next"></param>
        public RequestIPMiddleware(RequestDelegate next)
        {
            _next = next;
        }
        /// <summary>
        /// Invoke方法
        /// 返回值是Task,参数类型是HttpContext
        /// </summary>
        /// <param name="context">Http上下文</param>
        /// <returns></returns>
        public async Task Invoke(HttpContext context)
        {
            await context.Response.WriteAsync($"User IP:{context.Connection.RemoteIpAddress.ToString()}\r\n");
            // 调用管道中的下一个委托
            await _next.Invoke(context);
        }
    }
}

创建一个扩展方法,对IApplicationBuilder进行扩展

using Microsoft.AspNetCore.Builder;
namespace MiddlewareDemo.Middleware
{
    public static class RequestIPExtensions
    {
        /// <summary>
        /// 扩展方法,对IApplicationBuilder进行扩展
        /// </summary>
        /// <param name="builder"></param>
        /// <returns></returns>
        public static IApplicationBuilder UseRequestIP(this IApplicationBuilder builder)
        {
            // UseMiddleware<T>
            return builder.UseMiddleware<RequestIPMiddleware>();
        }
    }
}

最后在Startup类的Configure方法中使用自定义中间件

// 使用自定义中间件
app.UseRequestIP();

五、ASP.NET Core附带中间件组件

六、中间件和过滤器的区别

       中间件和过滤器都是一种AOP的思想。过滤器更加贴合业务,它关注于应用程序本身,关注的是如何实现业务,比如对输出结果进行格式化,对请求的ViewModel进行数据校验,这时就肯定要使用过滤器了。过滤器是MVC的一部分,它可以拦截到你Action上下文的一些信息,而中间件是没有这个能力的。可以认为过滤器是附加性的一种功能,它只是中间件附带表现出来的特征。中间件是管道模型里重要的组成部分,不可或缺,而过滤器可以没有。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NodeJS安装(npm包管理器)

1、nodejs下载 windows下的NodeJS安装是比较方便的&#xff0c; 只需要登陆官网&#xff08;Node.js&#xff09;&#xff0c;直接点击64-bit下载安装 2、安装过程基本直接“NEXT”&#xff0c;NodeJS已经集成了npm&#xff0c;所以npm也一并安装好了 3、在cmd窗口输入node -…

React-DevTools开发者工具安装

React开发者工具最简单的安装方式自然是科学上网&#xff0c;通过Google Chrome浏览器访问应用商店安装了。以下介绍另一种安装方式&#xff1a;基于 react-devtools的GitHub项目源码编译进行插件安装。 目录 React-DevTools&#xff1a;GitHub项目地址 React-DevTools&#x…

修改elementUI中el-date-picker内置样式

一.编写背景 今天正在日常的需求编写和bug调试中&#xff0c;产品提出了这样一个需求。为了满足用户在新增数据时的便捷准确&#xff0c;时间选择格式为“年月日时”&#xff0c;即用户不需要选择分合秒&#xff0c;换句话说就是下图中红色框的两项不需要。 二.问题分析。 当时…

基于vscode开发vue3项目的详细步骤教程 3 前端路由vue-router

1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客 3、基于vscode开发vue项目的详细步骤教程_水w的博客-CSDN博客 4、基于vscode开发vue项目的详细步骤教程 2 第三方图标库FontAw…

如何使用 JavaScript 读取文件

您可以使用 JavaScript File API 加载选定文件的内容。本节介绍 File API 的基本用法。 现在让我们看看如何使用 File API。 使用 JavaScript 读取文件概述 选择带有输入元素的文件 在 HTML 中&#xff0c;您可以通过将 input 元素的 type 属性设置为 file 来选择文件。 &…

vue 在for循环中设置ref并获取$refs

一、单循环动态设置ref 1.设置&#xff1a;【:ref“‘XXX’ index”】XXX -->自定义ref的名字 2.获取&#xff1a;let ref eval(‘this.$refs.XXX’ index)[0] 3.示例&#xff1a; 代码如下所示 <template><div class"ref_test"><div v-fo…

常用的几种布局方式---Flex 布局(垂直居中展示)

常用的几种布局方式---Flex 布局(垂直居中展示&#xff09; 前言一、默认使用静态布局二、flex布局1.父元素container1.1.display:flex1.2.flex-direction属性1.3.主轴与侧轴1.4.justify-content属性1.5.align-items属性1.6.flex-wrap属性2.子元素items 前言 怎样让一个元素在…

Vue2 概述

什么是Vue 引用官网的一段话:Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项…

如何统计前端项目有多少行代码

方法一&#xff1a;输入命令 前端项目核心代码主要在src目录下&#xff0c;打开项目找到src目录&#xff0c;右键点击 git bash here &#xff0c;然后输入命令&#xff1a; 1.包括空行&#xff08;会列出每个文件的代码行数&#xff09;&#xff1a; find . "(" …

Vue注册组件的几种方式,你都知道吗?

在开发中,经常需要将业务进行组件化,我们就需要去注册组件,下面列举几种常用的注册组件的方法 局部注册组件 1.首先需要将要注册的组件进行引入 2.在script标签中进行注册,注意:组件注册的名字和引入的名字需要保持一致即可进行简写 3.在template标签中以html的标签格式进行使…

web前端面试高频考点——Vue的高级特性(动态组件、异步加载、keep-alive、mixin、Vuex、Vue-Router)

系列文章目录 内容参考链接Vue基本使用Vue的基本使用&#xff08;一文掌握Vue最基础的知识点&#xff09;Vue通信和高级特性Vue组件间的通信及高级特性&#xff08;多种组件间的通信、自定义v-model、nextTick、插槽&#xff09;Vue高级特性Vue的高级特性&#xff08;动态组件…

Vue 进阶系列丨大文件切片上传

Vue 进阶系列教程将在本号持续发布&#xff0c;一起查漏补缺学个痛快&#xff01;若您有遇到其它相关问题&#xff0c;非常欢迎在评论中留言讨论&#xff0c;达到帮助更多人的目的。若感本文对您有所帮助请点个赞吧&#xff01;2013年7月28日&#xff0c;尤雨溪第一次在 GItHub…

Layui的基本使用(前端登录操作步骤)

目录 一.介绍layui 二.Layui相关的基本操作 1.下载Layui网站 &#xff1a;Layui - 经典开源模块化前端 UI 框架 ----------接下来的操作是实现一个Layui前端登录的效果------------- 2.创建项目 3.使用mybatis plus自动生成代码 (1).导入依赖 (2).导入生成类 (3).运行…

vscode+live server——更改端口号——基础积累

最近在写前台&#xff0c;通过jq写的&#xff0c;之前我一直嚷嚷jq基础薄弱&#xff0c;现在练手的来了。。。。 运行页面的时候&#xff0c;可以使用live server 1.vscode软件中安装live server 2.在html页面右击&#xff0c;有个open with live server 3.电脑默认的浏览器会…

Vue3中使用hooks,hooks究竟是个啥?如何理解

1.前言 最近被hooks这个词老是被提出&#xff0c;我经常听到但是又不会用&#xff0c;于是乎抽时间认真学习一下。 2.vue3 hooks 2.1 为什么vue3 可以使用hooks 因为vue2由选项式Api转为组合式Api。底层源码改了好多。 组合式API的好处&#xff1b; 就是在函数内可以使用声…

使用pynecone开发python web应用

环境•windows 10 64bit•python 3.8.15•pynecone 0.1.14简介Pynecone 是一个基于纯 python 的用于开发 web app 的开源框架&#xff0c;它依赖于 nodejs&#xff0c;不过不需要另外编写前端代码&#xff0c;这对于没有接触过前端的朋友是非常友好的。安装第一步&#xff0c;安…

Vue项目常见的错误以及解决办法

错误分类 vue项目中遇到的问题大体上分为两类&#xff1a;一类是基础的语法错误&#xff0c;另一类就是其它错误 这里简单分享以下我在项目中遇到的错误和解决办法&#xff0c;如果你也有&#xff0c;希望对你会有帮助 GET http://dida100.com:8888/api/cart 401 (Unauthoriz…

【前端修炼场】 — HTML常用的标志语言

此文为【前端修炼场】第三篇&#xff0c;上一篇文章链接&#xff1a;上一篇 文章目录前言标志语言基本结构介绍声明介绍标签修饰编码形式常用HTML标签标题标签段落标签换行标识水平线标识加粗标识倾斜标识删除线标识下划线标识上标 / 下标标识总结前言 之前我们使用过的那些标…

React 面向组件编程(上)

目录前言&#xff1a;一、组件的基本理解和使用1. 函数式组件2. 类式组件3. 注意事项4. 渲染函数式组件标签的基本流程5. 渲染类组件标签的基本流程二、组件三大核心属性 1&#xff1a;state1. 代码示例2. 效果展示3. 注意4. 设置状态:setState三、 组件三大核心属性 2&#xf…

小程序问题:封装公共组件的onLoad方法不生效

素材编辑 | 宋大狮 排版运营 | 小唐狮 ONE 问题描述 因为许久没有接触小程序项目&#xff0c;今天在做小程序项目时&#xff0c;为了节省时间&#xff0c;将要修改的页面组件直接拿出来封装成了公共组件&#xff0c;同时也没多想就直接使用了。于是就出现了页面数据不能加载的…