ASP.NET Core 中的中间件是 什么?
在 ASP.NET Core 中,中间件(Middleware)是一个可以处理 HTTP 请求或响应的软件管道。 ASP.NET Core 中给中间件组件的定位是具有非常特定的用途。例如,我们可能有需要一个中间件组件验证用户,另一个中间件来处理错误,另一个中间件来提供静态文件,如 JavaScript 文件,CSS 文件,图片等等。
我们使用这些中间件组件在 ASP.NET Core 中设置请求处理管道。这些管道决定了如何处理请求。 而请求管道是由Startup.cs文件中的Configure()方法进行配置,它也是应用程序启动的一个重要部分。 以下是Configure()方法中的代码。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.Run(async (context) =>
{
////获取进程名
//var processName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
var configVal = Configuration["MyKey"];
await context.Response.WriteAsync(configVal);
});
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
如您所见, 由空项目模板生成的Configure()方法中的代码中,一个非常简单的请求处理管道中,只有多个中间件。
现在,通过这个非常简单的请求处理管道,我们所有的应用程序都可以将消息写入,然后在由浏览器显示出来。
现在让我们了解什么是中间件以及它在 ASP.NET Core 中的工作原理。
下图帮助我们了解中间件组件以及它们如何适应请求处理管道
在 ASP.NET Core 中,中间件组件可以同时访问 - 传入请求和传出响应。 因此,中间件组件可以处理传入请求并将该请求,传递给管道中的下一个中间件以进行进一步处理。 例如,如果您有一个日志记录中间件,它可能只是记录请求的时间,它处理完毕后将请求传递给下一个中间件以进行进一步处理。
中间件组件可以处理请求, 并决定不调用管道中的下一个中间件,从而使管道短路,官方微软给了一个英文的名字叫"terminal middleware ",翻译为"终端中间件"。短路通常是被允许的,因为它可以避免一些不必要的工作。 例如, 如果请求的是像图像或 css 文件这样的静态文件, 则 StaticFiles 中间件可以处理和服务该请求并使管道中的其余部分短路。这个意思就是说,在我们的示例中, 如果请求是针对静态文件, 则 Staticile 中间件不会调用 MVC 中间件,避免一些无谓的操作。
中间件组件可以通过传入的 HTTP 请求来响应 HTTP 请求。例如,管道中的mvcmiddleware处理对URL/employee的请求并返回员工列表信息。
中间件组件还可以处理传出响应。例如,日志记录中间件组件可以记录响应发送的时间。此外,它还可以通过计算接收请求和响应发送时间之间的差异来计算处理请求所花费的所有时间。
中间件组件是按照添加到管道的顺序进行执行的。所以我们要注意以正确的顺序添加中间件,否则应用程序可能无法按预期运行,哪怕编译成功,但是程序还是会出错。
中间件组件应该用 NuGet 包的形式提供。由 NuGet 处理更新,尽量将中间件拆的足够小,提供每个中间件独立更新的能力。
根据您的程序要求,您可以向请求处理管道添加尽可能多的中间件组件。例如,如果您正在使用一些静态 HTML 页面和图像,开发简单的 Web 应用程序,那么您的请求处理管道可能只包含"StaticFiles"中间件。 这个就是模块化设计带来的好处,让每个人都像玩积木一样。 另一方面,如果您正在开发一个安全的数据驱动设计的 Web 应用程序,那么您可能需要几个中间件组件,如 StaticFiles 中间件,身份验证中间件,授权中间件,MVC 中间件等。 数据驱动设计,可以简单理解为复杂项目。
我想指出的是,系统是你的,你是系统的架构师, 您可以完全控制请求,处理管道中的配置。这也意味着, 从内存和性能的角度来看, 您只需为请求处理管道中的中间件组件支付流量费和服务器开支就好了。