时间:2021-05-25
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)。
到此这篇关于ASP.NET Core 中基于工厂的中间件激活详解的文章就介绍到这了,更多相关ASP.NET Core中间件激活内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
为什么异常处理选择中间件?传统的ASP.NET可以采用异常过滤器的方式处理异常,在ASP.NETCORE中,是以多个中间件连接而成的管道形式处理请求的,不过常用
前言今天给大家介绍一下在ASP.NETCore日常开发中用的比较多的两个中间件,它们都是出自于微软的ASP.NET团队,他们分别是Microsoft.AspNe
Asp.NetCore-中间件在这一章,我们将了解如何设置中间件。中间件技术在ASP.NETCore中控制我们的应用程序如何响应HTTP请求。它还可以控制应用程
本文实例讲述了ASP.NET实现基于Forms认证的WebService应用方法。分享给大家供大家参考。具体实现方法如下:在安全性要求不是很高的ASP.Net程
这篇文章探讨了让不同的请求去使用不同的中间件,那么我们应该如何配置ASP.NETCore中间件?其实中间件只是在ASP.NETCore中处理Web请求的管道。所