做网站阿里云记录值怎么填,wordpress自定义路由,给人做传销网站,外贸响应式网站这篇文章是 ASP.NET 6 中间件系列文章的第 3 部分#xff0c;你还可以阅读第1部分和第2部分。我们通过中间件创建的管道是有执行顺序的#xff0c;执行顺序与中间件的添加顺序是相同的#xff0c;接下来我们讨论一下为什么要有执行顺序#xff0c;以及它的重要性。示例项目… 这篇文章是 ASP.NET 6 中间件系列文章的第 3 部分你还可以阅读第1部分和第2部分。我们通过中间件创建的管道是有执行顺序的执行顺序与中间件的添加顺序是相同的接下来我们讨论一下为什么要有执行顺序以及它的重要性。示例项目在 GitHub 上可以获得这篇文章涉及到的代码https://github.com/zilor-net/ASPNET6Middleware/tree/Part3执行顺序在本系列的第1部分中中间件构成了一个管道该管道中的中间件按照一定的顺序执行如下图所示:请求按顺序经过各个中间件而响应则按相反的顺序返回。在前面的文章中我们已经定义了两个中间件类LoggingMiddleware用于记录请求/响应日志SimpleResponseMiddleware用于中断管道返回响应。在这篇文章中我们仍然以LoggingMiddleware为例app.UseLoggingMiddleware();添加延迟我们创建一个新的中间件类叫做IntentionalDelayMiddleware它看起来像这样:namespace MiddlewareNET6Demo.Middleware
{public class IntentionalDelayMiddleware{private readonly RequestDelegate _next;public IntentionalDelayMiddleware(RequestDelegate next){_next next;}public async Task InvokeAsync(HttpContext context){await Task.Delay(100);await _next(context);await Task.Delay(100);}}
}这个中间件在处理传入请求和处理传出响应时都会等待 100ms总等待时间为 200ms。当然实际场景下我们并不会这么做。在这里IntentionalDelayMiddleware只是代表了某种未定义的中间件它需要一个可预测的时间来执行。我们需要向管道中添加一个IntentionalDelayMiddleware的实例。问题在于我们是在LoggingMiddleware之前还是之后添加它?其实在这种情况下这个问题可能并不重要因为这两个中间件不会进行交互也不处理相同的事情。在这个示例中让我们在LoggingMiddleware之后添加IntentionalDelayMiddlewareapp.UseLoggingMiddleware();
app.UseIntentionalDelayMiddleware();如果现在运行应用程序我们可能不会发现明显的差异因为 200 毫秒相当快。添加执行时间中间件为了监视每个请求的所消耗的时间我们往往需要记录每个请求到我们系统的执行时间。这个需求对于中间件来说是非常简单的我们可以使用 .NET 提供的Stopwatch类和第2篇文章中创建的LoggingService来实现。下面是名为TimeLoggingMiddleware的中间件类using MiddlewareNET6Demo.Logging;
using System.Diagnostics;namespace MiddlewareNET6Demo.Middleware
{public class TimeLoggingMiddleware{private readonly RequestDelegate _next;private readonly ILoggingService _logger;public TimeLoggingMiddleware(RequestDelegate next, ILoggingService logger){_next next;_logger logger;}public async Task InvokeAsync(HttpContext context){Stopwatch watch new Stopwatch();watch.Start();await _next(context);watch.Stop();_logger.Log(LogLevel.Information, Time to execute: watch.ElapsedMilliseconds milliseconds.);}}
}我们需要将其添加到管道中。但是这里仍然有个问题我们应该添加到哪个位置?如果我们将TimeLoggingMiddleware添加到IntentionalDelayMiddleware之前那么后者所引起的延迟将包含在前者所度量的范围中。如果我们将TimeLoggingMiddleware添加到IntentionalDelayMiddleware之后那么后者所引起的延迟将不会包含在前者所度量的范围中。让我们来看看管道app.UseHttpsRedirection();
app.UseStaticFiles();// 如果该中间件发生任何延迟那么该延迟不会包含在时间日志中。
app.UseLoggingMiddleware();// 时间记录中间件
app.UseTimeLoggingMiddleware();// 延迟中间件。
// 此时延迟被包含在时间日志中。
app.UseIntentionalDelayMiddleware();app.UseRouting();app.UseAuthorization();app.MapRazorPages();app.Run();在这个 Program.cs 文件中哪个位置更适合放置TimeLoggingMiddleware其答案取决于几个问题时间日志需要包括诸如无效授权之类的执行时间吗如果是那么必须在调用app.UseAuthorization()之前放置TimeLoggingMiddleware。路由调用需要的时间非常少但可以测量。我们要把它包括进去吗如果是就必须在调用app.UseRouting()之前放置TimeLoggingMiddleware。像大多数现实世界的问题一样这个问题没有明确的答案。如果没有明确的指示那么这最终需要由开发人员根据系统的具体情况来做出决定。需要注意的是app.UseIntentionalDelayMiddleware();
app.UseTimeLoggingMiddleware();这两个是完全不同的app.UseTimeLoggingMiddleware();
app.UseIntentionalDelayMiddleware();这就是为什么中间件在管道中顺序很重要的一个例子。