新闻中心

ASP.NET Core 中的自定义中间件如何编写?

2025-10-28
浏览次数:
返回列表
自定义中间件用于处理HTTP请求响应逻辑,需包含RequestDelegate构造函数及InvokeAsync方法,通过UseMiddleware注册,可结合DI传递参数或实现IMiddleware接口以支持依赖作用域服务。

asp.net core 中的自定义中间件如何编写?

在 ASP.NET Core 中,自定义中间件用于处理 HTTP 请求和响应管道中的逻辑,比如日志记录、身份验证、异常处理等。编写自定义中间件非常灵活,可以通过类或内联方法实现,推荐使用类的方式以提高可维护性。

自定义中间件的基本结构

一个典型的中间件类包含以下要素:

  • 构造函数接收下一个中间件委托 RequestDelegate
  • 必须有一个名为 InvokeInvokeAsync 的公共方法,返回 Task
  • Invoke 方法中编写业务逻辑,并调用 _next(context) 继续执行管道

示例:记录请求耗时的中间件

public class RequestTimeMiddleware
{
    private readonly RequestDelegate _next;
<pre class="brush:php;toolbar:false;">public RequestTimeMiddleware(RequestDelegate next)
{
    _next = next;
}

public async Task InvokeAsync(HttpContext context)
{
    var startTime = DateTime.Now;

    await _next(context); // 继续执行后续中间件

    var endTime = DateTime.Now;
    var duration = endTime - startTime;

    Console.WriteLine($"请求 {context.Request.Path} 耗时: {duration.TotalMilliseconds}ms");
}

}

在程序中注册中间件

要使用自定义中间件,需在 Program.csUseMiddleware() 方法中注册。

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
<p>app.UseMiddleware<RequestTimeMiddleware>();</p><p>app.MapGet("/", () => "Hello World!");
app.Run();

传递参数给中间件

如果需要配置选项,可以结合依赖注入传入服务或配置对象。

C#开的网站购物交易系统 C#开的网站购物交易系统

一个用C#开的网站购物交易系统,带源码仅供学习参考,应用了WebCalendar控件。后台登陆帐号和密码分别为:admin admin WebCalendar控件是一个ASP.Net Web应用程序的日期控件,您可以通过设置控制控件中不同部分的样式的属性,来自定义 WebCalendar 控件的外观和图片;支持手动输入日期,支持输入时间,不会被TextBox,DropDownList遮挡。并且她是

C#开的网站购物交易系统 0 查看详情 C#开的网站购物交易系统
public class CustomHeaderMiddleware
{
    private readonly RequestDelegate _next;
    private readonly string _headerValue;
<pre class="brush:php;toolbar:false;">public CustomHeaderMiddleware(RequestDelegate next, string headerValue)
{
    _next = next;
    _headerValue = headerValue;
}

public async Task InvokeAsync(HttpContext context)
{
    context.Response.Headers["X-Custom-Header"] = _headerValue;
    await _next(context);
}

}

由于中间件构造函数不能直接接收非服务参数,可通过扩展方法封装:

public static class CustomHeaderExtensions
{
    public static IApplicationBuilder UseCustomHeader(
        this IApplicationBuilder builder, string value)
    {
        return builder.UseMiddleware<CustomHeaderMiddleware>(value);
    }
}

然后在 Program.cs 中使用:

app.UseCustomHeader("MyValue");

使用工厂模式创建中间件(高级)

若中间件需要依赖作用域服务,可使用 IMiddleware 接口,由容器管理生命周期。

public class ScopedLoggingMiddleware : IMiddleware
{
    private readonly ILogger<ScopedLoggingMiddleware> _logger;
<pre class="brush:php;toolbar:false;">public ScopedLoggingMiddleware(ILogger<ScopedLoggingMiddleware> logger)
{
    _logger = logger;
}

public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
    _logger.LogInformation("请求开始: {Path}", context.Request.Path);
    await next(context);
    _logger.LogInformation("请求结束: {Path}", context.Request.Path);
}

}

注册时需将中间件类型添加到服务容器:

builder.Services.AddTransient<ScopedLoggingMiddleware>();
// ...
app.UseMiddleware<ScopedLoggingMiddleware>();

基本上就这些。自定义中间件是构建可复用请求处理逻辑的核心方式,理解其执行顺序和生命周期有助于写出高效、清晰的管道逻辑。不复杂但容易忽略的是构造函数参数限制和作用域服务的正确使用。

以上就是ASP.NET Core 中的自定义中间件如何编写?的详细内容,更多请关注其它相关文章!


# 相关文章  # 内江营销型企业网站推广  # 东莞seo公司zgmasou  # 宁波链轮厂网站建设  # 全球营销推广  # 银川旅游网站建设  # 武穴seo获客策略  # 大安全网营销推广  # 视频推广网站推荐文案  # 舟山关键词排名怎么设置  # 连云港网络营销推广  # 可以通过  # 帐号  # 中间件  # 您可以  # 仅供  # 她是  # 推荐使用  # 是一个  # 的是  # 自定义  # gate  # .net  # 作用域  # ai  # app 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  Excel文件在线转换快速入口 Excel在线格式转换网站  J*aScript数组对象转换:按指定键分组与值收集  漫蛙2正版漫画站 漫蛙2网页版快速访问入口  C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器  如何使用spryker/configurable-bundles-products-resource-relationship模块解决复杂产品捆绑关系难题  Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation  Win11怎么设置鼠标指针速度_Win11提高鼠标指针精确度选项  Centos/Linux 系统下安装 composer 的完整步骤  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整  mysql如何设置表访问权限_mysql表访问权限配置  抖音DOU+怎么投最有效 抖音付费推广的ROI提升技巧  漫蛙2漫画入口 漫蛙正版网页漫画直达网址  J*aScript打印功能_j*ascript输出控制  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】  Golang如何使用const iota_Go iota常量计数器讲解  知音漫客正版漫画平台_知音漫客官网账号登录  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  Lar*el 递归关系中排除指定分支的教程  html5 app怎么运行环境_配html5 app运行环境【教程】  12306怎么选座位选到安静区_12306选座安静区域选择策略  4399网页游戏电脑版全新入口 4399电脑端在线玩指南  J*aScript中正确使用querySelectorAll与复杂CSS选择器  PDF文件体积过大处理_PDF压缩技巧详解  Yandex搜索引擎一键访问入口_俄罗斯Yandex官网免登录  必由学登录入口 必由学官方网站在线访问链接  Composer中的^和~符号代表什么_精通Composer版本号语义化约束  J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明  快手赚钱渠道_快手收益来源  sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统  蛙漫2台版漫画地址 Manwa2正版网页版链接  J*a编写用户注册与登录功能_掌握字符串与验证逻辑  德邦快递查询平台 德邦快递物流信息查询入口  163邮箱官方主页登录 直达网易邮箱登录核心页面  MongoDB聚合管道:正确匹配对象数组中_id的方法  2026春节假期票务安排_2026春节放假购票指南  Lar*el 8 多关键词数据库搜索优化实践  如何在网页中实现特定地点的随机图片展示  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  Win11怎么修改默认浏览器_Windows 11设置Chrome为默认  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南 

搜索