了解 ASP.NET Core 中的中间件
在 .NET Core 中,中间件(Middleware) 是处理 HTTP 请求和响应的核心组件。它们被组织成一个请求处理管道,每个中间件都可以在请求到达最终处理程序之前或之后执行操作。中间件可以用于实现各种功能,如身份验证、路由、日志记录、异常处理、静态文件服务等。
什么是中间件?
中间件是 HTTP 请求管道中的一个处理单元,负责处理传入的 HTTP 请求和返回的 HTTP 响应。每个中间件都有以下职责:
- 处理请求:可以对请求进行预处理(如修改请求内容、验证身份等)。
- 决定是否继续传递请求:可以选择将请求传递给下一个中间件,或者直接返回响应(短路请求管道)。
- 处理响应:可以在响应返回给客户端之前进行后处理(如添加响应头、记录日志等)。
中间件的工作原理
中间件的工作原理可以概括为以下几个步骤:
- 请求进入管道:
- 当一个 HTTP 请求进入应用程序时,它首先通过一系列的中间件组件。
- 每个中间件都有机会处理请求,并决定是否将请求传递给下一个中间件。
- 中间件的执行顺序:
- 中间件是按照添加的顺序依次执行的。
- 例如,身份验证中间件通常应该在路由中间件之前执行,以确保在路由处理请求之前已经进行了身份验证。
- 中间件的组成:
- 每个中间件通常是一个
Func<requestdelegate, requestdelegate=""></requestdelegate,>
委托,或者是一个实现了IMiddleware
接口的类。 RequestDelegate
是一个表示处理 HTTP 请求的委托,它接收一个HttpContext
对象并返回一个Task
。- 中间件的执行流程:
- 当请求进入中间件时,中间件可以选择:
- 处理请求并直接返回响应(短路请求管道)。
- 将请求传递给下一个中间件(调用
next(context)
)。 - 如果中间件调用了
next(context)
,那么请求将继续传递到下一个中间件。 - 当请求通过所有中间件后,最终的处理程序(如控制器)将处理请求并生成响应。
- 响应会按照相反的顺序通过中间件管道返回给客户端。
常见的中间件及其工作原理
以下是一些常见的中间件及其工作原理:
1. 身份验证中间件(Authentication Middleware)
- 作用:用于处理用户身份验证。
- 工作原理:
- 在请求到达控制器之前,身份验证中间件会检查请求中是否包含有效的身份验证信息(如 JWT 令牌、Cookie 等)。
- 如果身份验证成功,中间件会将用户信息存储在
HttpContext.User
中。 - 如果身份验证失败,中间件可以重定向到登录页面或返回 401 未授权响应。
示例:
public void Configure(IApplicationBuilder app)
{
app.UseAuthentication(); // 启用身份验证
app.UseAuthorization(); // 启用授权
}
2. 路由中间件(Routing Middleware)
- 作用:用于将请求路由到相应的处理程序(如控制器)。
- 工作原理:
- 路由中间件会解析请求的 URL 和 HTTP 方法,并根据配置的路由规则将请求映射到相应的处理程序。
- 路由规则可以通过
UseRouting
和UseEndpoints
配置。
示例:
public void Configure(IApplicationBuilder app)
{
app.UseRouting(); // 启用路由解析
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
3. 静态文件中间件(Static Files Middleware)
- 作用:用于提供静态文件(如 HTML、CSS、JavaScript 文件)。
- 工作原理:
- 静态文件中间件会检查请求的 URL,如果请求的是静态文件(如
wwwroot
目录下的文件),则直接返回文件内容。 - 如果请求的不是静态文件,则将请求传递给下一个中间件。
示例:
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles(); // 启用静态文件服务
}
4. 异常处理中间件(Exception Handling Middleware)
- 作用:用于捕获和处理应用程序中的异常。
- 工作原理:
- 异常处理中间件会捕获管道中抛出的异常,并根据配置返回友好的错误页面或 JSON 响应。
- 通常用于开发环境和生产环境。
示例:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage(); // 开发环境:显示详细错误页面
}
else
{
app.UseExceptionHandler("/Home/Error"); // 生产环境:重定向到错误页面
}
}
5. 日志记录中间件(Logging Middleware)
- 作用:用于记录请求和响应的日志信息。
- 工作原理:
- 日志记录中间件可以在请求进入和离开管道时记录日志。
- 通常通过第三方库(如 Serilog)或内置的日志记录系统实现。
示例:
public class LoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<LoggingMiddleware> _logger;
public LoggingMiddleware(RequestDelegate next, ILogger<LoggingMiddleware> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
_logger.LogInformation($"Request: {context.Request.Method} {context.Request.Path}");
await _next(context);
_logger.LogInformation($"Response: {context.Response.StatusCode}");
}
}
自定义中间件
你可以创建自定义中间件来处理特定的需求。自定义中间件通常是一个类,它包含一个 Invoke
或 InvokeAsync
方法,该方法接收 HttpContext
和一个 RequestDelegate
参数。
示例:
public class CustomMiddleware
{
private readonly RequestDelegate _next;
public CustomMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
// 在调用下一个中间件之前执行的操作
await context.Response.WriteAsync("Custom Middleware: Before\n");
// 调用下一个中间件
await _next(context);
// 在调用下一个中间件之后执行的操作
await context.Response.WriteAsync("Custom Middleware: After\n");
}
}
然后在 Startup.cs
中使用这个中间件:
public void Configure(IApplicationBuilder app)
{
app.UseMiddleware<CustomMiddleware>();
// 其他中间件
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync("Hello World!");
});
});
}
总结
- 中间件 是 .NET Core 中处理 HTTP 请求和响应的核心组件,它们被组织成一个管道。
- 中间件的工作原理是:请求依次通过每个中间件,每个中间件可以选择处理请求、传递请求或短路请求管道。
- 常见的中间件包括身份验证、路由、静态文件服务、异常处理和日志记录。
- 你可以通过自定义中间件来实现特定的功能。
通过理解中间件的工作原理和常见应用场景,你可以更好地设计和优化 .NET Core 应用程序的请求处理流程。
了解 ASP.NET Core 中的中间件的更多相关文章
- 在Asp.net Core中使用中间件来管理websocket
介绍 ASP.NET Core SignalR是一个有用的库,可以简化Web应用程序中实时通信的管理.但是,我宁愿使用WebSockets,因为我想要更灵活,并且与任何WebSocket客户端兼容. ...
- ASP.NET Core 中的中间件
前言 由于是第一次写博客,如果您看到此文章,希望大家抱着找错误.批判的心态来看. sky! 何为中间件? 在 ASP.NET Framework 中应该都知道请求管道.可参考:浅谈 ASP.NET ...
- 在Asp.Net Core中使用中间件保护非公开文件
在企业开发中,我们经常会遇到由用户上传文件的场景,比如某OA系统中,由用户填写某表单并上传身份证,由身份管理员审查,超级管理员可以查看. 就这样一个场景,用户上传的文件只能有三种人看得见(能够访问) ...
- Asp.Net Core 通过自定义中间件防止图片盗链的实例(转)
一.原理 要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或 ...
- ASP.NET Core系列:中间件
1. 概述 ASP.NET Core中的中间件是嵌入到应用管道中用于处理请求和响应的一段代码. 2. 使用 IApplicationBuilder 创建中间件管道 2.1 匿名函数 使用Run, Ma ...
- ASP.NET Core 中的那些认证中间件及一些重要知识点
前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...
- [转]ASP.NET Core 中的那些认证中间件及一些重要知识点
本文转自:http://www.qingruanit.net/c_all/article_6645.html 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系 ...
- 在ASP.NET Core 中使用Cookie中间件
在ASP.NET Core 中使用Cookie中间件 ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分 ...
- ASP.NET Core中使用GraphQL - 第二章 中间件
前文:ASP.NET Core中使用GraphQL - 第一章 Hello World 中间件 如果你熟悉ASP.NET Core的中间件,你可能会注意到之前的博客中我们已经使用了一个中间件, app ...
- ASP.NET Core 中的SEO优化(2):中间件中渲染Razor视图
前言 上一篇文章<ASP.NET Core 中的SEO优化(1):中间件实现服务端静态化缓存>中介绍了中间件的使用方法.以及使用中间件实现服务端静态化缓存的功能.本系列文章的这些技巧都是我 ...
随机推荐
- 批处理-- 查询进程,杀进程,启动pythond程序,任务计划程序
@echo off wmic process where caption="python.exe" get processid,commandline | findstr &quo ...
- esp8266+MQTT+DHT11(温湿度计) platformio
esp8266 + MQTT + DHT11(温湿度计) 连线 #include <Arduino.h> #include <ESP8266WiFi.h> #include & ...
- QT Creator项目路径设置
1.一些中间文件的生成路径的设置 MOC_DIR = temp/moc RCC_DIR = temp/rcc UI_DIR = temp/ui OBJECTS_DIR = temp/obj 这样设置之 ...
- UE4纯C++实现游戏快捷栏之创建快捷栏UI
作为一个在游戏界面中显示的快捷栏,我们需要在游戏运行时就显示出快捷栏UI,故我们创建两个Widget. 1.GameHUDWidget:负责游戏中界面UI的整体显示 2.ShortcutWidget: ...
- 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现一
一.前言介绍: 1.1 项目摘要 随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势.古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力.然而,在现代社会中 ...
- macos安装Charles
一.安装jdk 1.地址:https://www.oracle.com/cn/java/technologies/downloads/#java11,下载后双击安装 2.查看java的安装地址,在ma ...
- MySQL注入之Fuzz测试&Bypass WAF小结
目录 BurpSuite Fuzz测试 内联注释 绕过union[]select联合查询 绕过敏感函数 绕过from[]information_schema查表 报错注入示例 常规绕过思路总结 空格绕 ...
- vivo 企业云盘服务端实现简介
作者:来自 vivo 互联网存储团队- Cheng Zhi 本文将介绍企业云盘的基本功能以及服务端实现. 一.背景 vivo 企业云盘是一个企业级文件数据管理服务,解决办公数据的存储.共享.审计等文件 ...
- SpringMVC源码剖析(三)- DispatcherServlet的初始化流
在我们第一次学Servlet编程,学java web的时候,还没有那么多框架.我们开发一个简单的功能要做的事情很简单,就是继承HttpServlet,根据需要重写一下doGet,doPost方法,跳转 ...
- Linux系统之Ubuntu
常用命令: #查看安装包 dpkg -l 1)切换镜像源 本身的镜像都是国外的,下载依赖包太慢, 需要替换成国内镜像地址 国内镜像源推荐阿里 OPSX 源: https://opsx.alibaba. ...