app.Use(async (context, next) =>
{
// в этой строчке можно выполнить любые действия в начале каждого запроса
try { await next(context); }
finally
{
// в этой точке можно выполнить любые действия в конце каждого запроса
}
});
如果需要,可以将此代码移动到单独的类中,它还将帮助中间件拥有自己的依赖项:
public class MyImportantMiddleware
{
private readonly RequestDelegate _next;
public MyImportantMiddleware(RequestDelegate next, …)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context, …)
{
// в этой строчке можно выполнить любые действия в начале каждого запроса
try { await _next(context); }
finally
{
// в этой точке можно выполнить любые действия в конце каждого запроса
}
}
}
最简单的方法是使用中间件。只需在您的请求处理程序链中找到正确的位置,然后在其中添加您需要的任何内容:
如果需要,可以将此代码移动到单独的类中,它还将帮助中间件拥有自己的依赖项:
在这种情况下,可以在构造函数中获取依赖项(此类依赖项必须是单例或瞬态依赖于它们),或者直接进入 InvokeAsync 方法。您可以通过
.UseMiddleware<MyImportantMiddleware>()
.如果您需要执行某些操作而不是针对任何请求,而只是针对一组“收藏夹”(反之亦然,您需要排除某些组) - 您可以使用端点元数据。为此,首先,将中间件放在 UseRouting 之后 - 其次,使用属性检索元数据
context.GetEndpoint();
以获取端点。Metadata
元数据本身可以使用属性添加到端点(方法的任何属性都成为元数据)。如果您已经在谈论作用域依赖注入,那么是的,这样您还可以在每个请求中执行操作。但是,此类操作不会在每个请求开始时执行,而是仅在请求处理程序需要您的依赖项时执行。另一方面,通过这种方式,您可以捕获不是 HTTP 请求的请求。
无论如何,如果您对这种方式感到满意,您可以使用 IDisposable 接口及其 Dispose 方法在处理请求结束时执行操作。