.NET Core技术研究-中间件的由来和使用
? 我们将原有ASP.NET应用升级到ASP.NET Core的过程中,会遇到一个新的概念:中间件。 ? 中间件是ASP.NET Core全新引入的概念。中间件是一种装配到应用管道中以处理请求和响应的软件。?每个组件:
? 单独看以上中间件的定义,一个很直观的感觉:中间件是HTTP请求管道中的一层层的AOP扩展。 ? 在展开介绍中间件之前,我们先回顾一下ASP.NET中HttpHandler和HttpModule的处理方式。 ?一、ASP.NET中HttpHandler和HttpModule ? 先看一张图: ? ?? ? ?上图中有两个概念HttpHandler和HttpModule,其中: ? ?HttpHandler用于处理具有给定文件名或扩展名的请求。比如上图中的.report类的请求,同时,任何一个HttpHandler都需要实现接口IHttpHandler,都需要在Web.Config配置文件中注册使用。 ? ?HttpModule用于处理每个请求调用,比如上图中的Authorization Module,每个Http请求都会经过HttpModule的处理。通过HttpModule可以中断Http请求,可以自定义HttpResponse返回。同时,任何一个HttpModule都需要实现接口IHttpModule,都需要在Web.Config配置文件中注册使用。 ? ASP.NET Core引入了中间件来实现上面2种Http请求处理扩展。ASP.NET Core中间件和 ASP.NET?HttpHandler HttpModule有什么区别? ? 二、ASP.NET Core中间件和 ASP.NET?HttpHandler HttpModule的区别 ? 1. 中间件比HttpHandler、HttpModule更简单
? ?2. 中间件类似于HttpModule? ? ?
? ?3. 中间件和HttpModule按不同的顺序处理
? ? ?? ?三、ASP.NET Core中间件的设计原理 ? ?ASP.NET Core 请求管道包含一系列请求委托,依次调用。 下图演示了这一概念。 沿黑色箭头执行。 ? ? ? ?每个请求委托(中间件)都可以在下一个请求委托(中间件)之前和之后执行操作。中间件中的异常处理委托应该在管道的早期被处理,这样就可以捕获在管道后期发生的异常。 ? ?在Startup.Configure 方法中添加中间件组件的顺序定义了针对请求调用这些中间件的顺序,以及响应的相反顺序。 这个顺序对于安全性、性能和功能非常重要。 ? ?看一段示例代码: public void Configure(IApplicationBuilder app,IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
// app.UseCookiePolicy();
app.UseRouting();
// app.UseRequestLocalization();
// app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
// app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllerRoute(
name: "default",pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
上述代码中每个中间件扩展方法都通过 Microsoft.AspNetCore.Builder 命名空间在 IApplicationBuilder 上公开。 ? ? ? ? app.Use***都是各种常用的内置中间件。比如: ? ? ? 1. 异常处理类中间件。如上述代码中: ? ? ? ? ? ?当应用在开发环境中运行时:异常显示页中间件 (UseDeveloperExceptionPage) 报告应用运行时错误。数据库错误页中间件报告数据库运行时错误。(app.UseDatabaseErrorPage();) ? ? ? ? ? ?当应用在生产环境中运行时:异常处理程序中间件 (UseExceptionHandler) 捕获以下中间件中引发的异常。TTP 严格传输安全协议 (HSTS) 中间件 (UseHsts) 添加 Strict-Transport-Security 标头。 ? ? ? 2.?HTTPS 重定向中间件 (UseHttpsRedirection) 将 HTTP 请求重定向到 HTTPS。 ? ? ? 3.?静态文件中间件 (UseStaticFiles) 返回静态文件,并简化进一步请求处理。 ? ? ? 4.?Cookie 策略中间件 (UseCookiePolicy) 使应用符合欧盟一般数据保护条例 (GDPR) 规定。 ? ? ? 5.?用于路由请求的路由中间件 (UseRouting)。 ? ? ? 6.?身份验证中间件 (UseAuthentication) 尝试对用户进行身份验证,然后才会允许用户访问安全资源。 ? ? ? 7.?用于授权用户访问安全资源的授权中间件 (UseAuthorization)。 ? ? ? 8.?会话中间件 (UseSession) 建立和维护会话状态。 如果应用使用会话状态,请在 Cookie 策略中间件之后和 MVC 中间件之前调用会话中间件。 ? ? ? 9.?用于将 Razor Pages 终结点添加到请求管道的终结点路由中间件(带有 MapRazorPages 的 UseEndpoints)。 ? ? ? 10.?对于单页应用程序 (SPA),SPA 中间件 UseSpaStaticFiles 通常是中间件管道中的最后一个。 SPA 中间件处于最后的作用是:允许所有其他中间件首先响应匹配的请求。允许具有客户端侧路由的 SPA 针对服务器应用无法识别的所有路由运行。 ? ? ? ?还有很多其他的内置中间件,可以参考链接:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.0。如下图, ? ? ? ? ? ? ? 了解了ASP.NET Core内置的中间件之后,我们可能需要自定义一些中间件,比如说原有的ASP.NET HttpModule和HttpHandler. ? ? ? 接下来第四部分,我们继续示例: ?四、自定义中间件 ? ?将已有HttpModule用自定义中间件实现 ? ?先看一下原有HttpModule的一个实现: /// <summary>
/// 自定义HTTP扩展模块
/// </summary>
public class CustomerHttpModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += Context_BeginRequest;
}
private void Context_BeginRequest(object sender,EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
// Do something
}
public void Dispose()
{
}
}
迁移到中间件实现: ? ? /// <summary>
/// 自定义中间件
/// </summary>
public class CustomerMiddleware
{
private readonly RequestDelegate _next;
public CustomerMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
// Do something with context near the beginning of request processing.
await _next.Invoke(context);
// Clean up.
}
}
同时增加IApplicationBuilder的一个扩展方法: public static IApplicationBuilder UseCustomerMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<CustomerMiddleware>();
}
Startup中使用这个中间件:? ? ? app.UseCustomerMiddlewares();
?以上是对ASP.NET Core中中间件的技术由来整理和使用分享。 ? 周国庆 2020/4/4? ? ? ? ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 资源-DotNet-站点:DotNet 站点列表
- .net – 将GUID转换为整数和后退
- asp.net-mvc – 关闭不显眼的验证运行时?
- msbuild – 通过TFS 2015部署ASP.NET 5(vNext)
- asp.net – 是否有可能过滤SignalR中的接收器?
- asp.net:控件/页面的页面生命周期顺序与其中的用户contorl
- asp.net-identity – Web API 2和ASP Identity – 处理被锁
- asp.net-mvc – 尝试方法… HttpConfiguration …访问方法…
- asp.net – 为什么在添加新的响应标头时会出现“平台不支持
- asp.net – Web.config允许特定用户的位置访问
- asp.net – 您在哪里存储数据库连接字符串?
- asp.net – Visual Studio源代码控制/版本控制,V
- asp.net-mvc – ASP.NET MVC4 WebApi参数为null
- asp.net – 在.NET中使用WCF如何让它自动生成像A
- asp.net – Azure网站和Azure云服务之间的区别
- asp.net-web-api – 使用Owin时无法获取ASP.NET
- asp.net-mvc-3 – mvc3 https&http
- asp.net-core – 从ASP.NET CORE中的appsettings
- asp.net – 避免重复大型应用程序
- .net – “无法加载文件或程序集……”DotNetOpe