ASP.NET Core 中基于工厂的中间件激活

IMiddlewareFactory/IMiddleware 是中间件激活的扩展点。

UseMiddleware 扩展方法检查中间件的已注册类型是否实现 IMiddleware。 如果是,则使用在容器中注册的 IMiddlewareFactory 实例来解析 IMiddleware 实现,而不使用基于约定的中间件激活逻辑。 中间件在应用的服务容器中注册为作用域或瞬态服务。

优点:

  • 按客户端请求(作用域服务的注入)激活

  • 让中间件强类型化

IMiddleware 按客户端请求(连接)激活,因此作用域服务可以注入到中间件的构造函数中。

IMiddleware

IMiddleware 定义应用的请求管道的中间件。InvokeAsync(HttpContext, RequestDelegate) 方法处理请求,并返回代表中间件执行的 Task。

使用约定激活的中间件:

public class ConventionalMiddleware
{private readonly RequestDelegate _next;public ConventionalMiddleware(RequestDelegate next){_next = next;}public async Task InvokeAsync(HttpContext context, AppDbContext db){var keyValue = context.Request.Query["key"];if (!string.IsNullOrWhiteSpace(keyValue)){db.Add(new Request(){DT = DateTime.UtcNow, MiddlewareActivation = "ConventionalMiddleware", Value = keyValue});await db.SaveChangesAsync();}await _next(context);}
}

使用 MiddlewareFactory 激活的中间件:

public class FactoryActivatedMiddleware : IMiddleware
{private readonly AppDbContext _db;public FactoryActivatedMiddleware(AppDbContext db){_db = db;}public async Task InvokeAsync(HttpContext context, RequestDelegate next){var keyValue = context.Request.Query["key"];if (!string.IsNullOrWhiteSpace(keyValue)){_db.Add(new Request(){DT = DateTime.UtcNow, MiddlewareActivation = "FactoryActivatedMiddleware", Value = keyValue});await _db.SaveChangesAsync();}await next(context);}
}

程序会为中间件创建扩展:

public static class MiddlewareExtensions
{public static IApplicationBuilder UseConventionalMiddleware(this IApplicationBuilder builder){return builder.UseMiddleware<ConventionalMiddleware>();}public static IApplicationBuilder UseFactoryActivatedMiddleware(this IApplicationBuilder builder){return builder.UseMiddleware<FactoryActivatedMiddleware>();}
}

无法通过 UseMiddleware 将对象传递给工厂激活的中间件:

public static IApplicationBuilder UseFactoryActivatedMiddleware(this IApplicationBuilder builder, bool option)
{// Passing 'option' as an argument throws a NotSupportedException at runtime.return builder.UseMiddleware<FactoryActivatedMiddleware>(option);
}

将工厂激活的中间件添加到 Startup.ConfigureServices 的内置容器中:

public void ConfigureServices(IServiceCollection services)
{services.AddDbContext<AppDbContext>(options =>options.UseInMemoryDatabase("InMemoryDb"));services.AddTransient<FactoryActivatedMiddleware>();services.AddRazorPages();
}

两个中间件均在 Startup.Configure 的请求处理管道中注册:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}else{app.UseExceptionHandler("/Error");}app.UseConventionalMiddleware();app.UseFactoryActivatedMiddleware();app.UseStaticFiles();app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapRazorPages();});
}

IMiddlewareFactory

IMiddlewareFactory 提供中间件的创建方法。 中间件工厂实现在容器中注册为作用域服务。

可在 Microsoft.AspNetCore.Http 包中找到默认的 IMiddlewareFactory 实现(即 MiddlewareFactory)。

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

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

相关文章

java面试题_阿里大厂流出的数百道 Java 经典面试题

BAT 常问的 Java基础39道常见面试题1.八种基本数据类型的大小&#xff0c;以及他们的封装类2.引用数据类型3.Switch能否用string做参数4.equals与的区别5.自动装箱&#xff0c;常量池6.Object有哪些公用方法7.Java的四种引用&#xff0c;强弱软虚&#xff0c;用到的场景8.Hashc…

php怎么压缩文字,php实现的简单压缩英文字符串的代码

PHP,适应于上帖简单加密后的密文//replacement来自上个版本的加密替换function compress_func($match) {return strlen($match[0]).$match[0]{0};}function uncompress_func($match) {return str_repeat($match[2], $match[1]);}function compress($str) {$i 0;$pattern arra…

​被冷落的运算符重载

基本类型可以使用运算符进行运算、比较、取反等操作。如果想使用运算符操作两个对象&#xff0c;我们就需要用到运算符重载。我们先看个例子&#xff0c;假如有个房子类&#xff0c;有长和宽两个属性。代码如下&#xff1a;接下来我们使用House类实例化两个对象&#xff1a;hou…

如何在MATLAB中把变量填到Word中,matlab数据写入现有excel表格-如何将matlab中变量写入excel...

如何将matlab 中的数据写入现有的word 表格中&#xff1f;你可以这样做&#xff1a;(1)先在matlab里面&#xff0c;把相关数据导出、保存成csv格式的文件&#xff1b;比如说&#xff0c;你可以在workspace视图底下&#xff0c;把相关的变量直接导出&#xff1b;(2)用excel打开c…

neo4j 查询同一节点的两个上级_WhatRoute for Mac(互联网流量诊断查询工具)

如果您想在不使用命令行的情况下执行流量诊断查询&#xff0c;那么WhatRoute是一个不错的选择。WhatRoute提供了一个干净且有条理的界面&#xff0c;主要提供Traceroute功能&#xff0c;但也可以执行Ping&#xff0c;域名服务查询&#xff0c;Whois查询以及监控进出计算机的流量…

matlab的灰色关联,灰色关联度Matlab代码

load x.txt %把原始数据存放在纯文本文件x.txt中&#xff0c;其中把数据的"替换替换成.for i1:40x(i,:)x(i,:)/x(i,1); %标准化数据enddatax;nsize(data,2); %求矩阵的列数&#xff0c;即观测时刻的个数ckdata(1,:); %提出参考数列bjdata(2:end,:); %提出比较数列m2size(b…

快来参加学习.NET 挑战赛

今天访问dot.net 网站看到了一个学习.NET 挑战赛&#xff0c;发现已经赛程过半了&#xff0c;这是一个为那些想更多地了解 C# 和 .NET 的人举办的一个完全免费的课程活动&#xff0c;这些模块必须在 11 月底前完成。参加这个挑战赛&#xff0c;你必须从 .NET 学习挑战页面进入进…

excel怎么设置打印区域_别再浪费打印纸了!这样设置,Excel表格再大都能打印成一页!...

在打印Excel表格时&#xff0c;你是不是经常碰到过这种情况&#xff1a;明明排版好的表格&#xff0c;结果打印完却发现只显示一半......表格太宽导致无法打印在A4纸上......今天叨叨君就来分享几个有效的解决方法&#xff0c;教你轻轻松松将表格打印在一页纸上&#xff0c;一起…

matlab size x 2,Matlab中的N=size(X,2)是什么意思

size()&#xff1a;获取矩阵的行数和列数(1)ssize(A),当只有一个输出参数时&#xff0c;返回一个行向量&#xff0c;该行向量的第一个元素时矩阵的行数&#xff0c;第二个元素是矩阵的列数。(2)[r,c]size(A),当有两个输出参数时&#xff0c;size函数将矩阵的行数返回到第一个输…

.NET必知的EventCounters性能指标监视器

在.NET我们对于性能指标监控&#xff0c;其实常见的有两个方法&#xff0c;一个是CLI工具dotnet-counters而另一个是代码级别的EventListener.使用dotnet-countersdotnet-counters是一个性能指标监视工具&#xff0c;用于临时运行状态监视和初级性能调查。它可以观察通过 Event…

xcode 修改 infodictionary_安卓系统修改复位键生效时间

文档说明本文档以SC806-CN-00(msm8909平台&#xff0c;Android 7)为例&#xff0c;说明如何修改复位键生效时间。应用背景默认情况下&#xff0c;按复位键&#xff0c;系统马上直接关机。在实际应用中&#xff0c;有可能由于干扰造成的抖动导致误关机行为。 为避免发生这种情况…

为什么曾经优秀的人突然变得平庸?

职场&认知洞察 丨 作者 / findyi这是findyi公众号分享的第95篇原创文章一个读者的提问&#xff1a;洋哥&#xff0c;我从小都是学霸&#xff0c;本硕都是985&#xff0c;计算机科班出身&#xff0c;但进入职场后却始终无法取得突破。工作5年还是基层员工&#xff0c;我该怎…

php xlsx格式转换csv,我想使用C将.xls或.xlsx文件转换为.csv格式#

我试图用C编写代码,将.xls/.xlsx文件转换为.csv文件,打开文件后将其保存为.csv文件,但结果文件仍然具有所有Excel属性(如合并单元格、标题等),但当我查看属性时,它将文件类型显示为.csv。在我的代码中,我打开一个execl并使用saveas保存它。using System;using System.Collectio…

java编程_Java编程和C语言的比较

很多人都拿Java编程和c语言相比较&#xff0c;那么今天小编就来先说说个人理解吧&#xff0c;新手学习Java很简单&#xff0c;上手也很容易&#xff0c;只需要会拼音就可以&#xff0c;简单而且没有门槛&#xff0c;而c语言学习成本高&#xff0c;更需要投入较大的精力&#xf…

.NET Core3.1升级.NET5,坑还真不少...

11月11号是电商狂欢的日子&#xff0c;也是.NET5正式发布的日子&#xff0c;媳妇儿等着零点秒杀&#xff0c;我却在刷新着微软官网等更新&#xff0c;然后第一时间开始折腾。此前Scott Hunter在博客信誓旦旦.NET Core3.1平滑迁移.NET5&#xff0c;于是当天就去升级我的宝藏项目…

mysql查询语句4,MySQL(4):CRUD语句(2)——基本查询

“增删改查”的查询语句。create table student(id int,name varchar(20),chinese float,english float,math float);insert into student(id,name,chinese,english,math) values(1,张小明,89,78,90);insert into student(id,name,chinese,english,math) values(2,李进,67,98,5…

requestPermissions读写手机存储权限_泛圈云盘可为企业建立高效安全的云办公在线协同文档存储?...

泛圈企业云盘结合智能手机和无线网络&#xff0c;实现对任何办公地点和办公时间的无缝访问&#xff0c;提高办公效率。它可以连接客户原有的各种IT系统&#xff0c;包括OA、邮件、ERP等各种个人业务系统&#xff0c;使手机也可以用来操作、浏览、管理公司的所有工作事务&#x…

怎么将SVG转成PNG(.NET工具包编写)

序一天&#xff0c;作者在深圳湾吹风时突然想到自己还有 20 多位粉丝&#xff0c;所以决定每周至少要水一篇文章。众所周知&#xff0c;一篇文章要有封面&#xff0c;正痛苦时&#xff0c;.NET 官方网站更新了一大波质量上乘的插图&#xff1b;高兴之余&#xff0c;发觉平台不支…

matlab 数组 冒号,matlab中冒号的用法

转自&#xff1a;https://hi.baidu.com/sunsee/item/9985c91895bd88f8ddeecae3对于A(四行五列)矩阵,A(2:3,1:2:5)是什么意思?问题补充&#xff1a;能解释下为什么是一,三,五列满意回答显示A的第二行与第三行的第一、三、五列。因为矩阵后面如果是圆括号&#xff0c;那么都表示…

ghelper怎么在手机上用_当长时间不用手机玩《崩坏3》、《战双》

崩坏3、战双&#xff0c;虽然是手机游戏&#xff0c;作为一个PC党&#xff0c;我还是热衷于用电脑玩游戏。用电脑玩游戏可以把画质全部开到最大&#xff0c;依旧可以顺畅地进行游戏。手机就不行&#xff0c;即使是苹果&#xff0c;把画质拉满&#xff0c;依旧会有卡顿。特别是崩…