如何在 UseEndpoints 之前检查路由在 .NET Core 中间件中是否有效?

How can I check if a route is valid in a .NET Core middleware before UseEndpoints does?

我正在使用 .NET Core 3.1,正在创建一个网站 api。

我的 API 控制器映射如下:

app.UseEndpoints(endpoints => endpoints.MapControllers());

有没有一种方法可以让我仅在路由匹配时执行操作,但在实际控制器操作执行之前?

我处于需要在执行应用程序逻辑之前在数据库中创建实体的情况。

我最初考虑过自定义中间件,但后来才意识到,如果我将中间件放在 app.UseEndpoints 之前,它会针对任何和所有请求触发(会创建很多虚拟实体),即使那些没有'路线。

如果我将它放在 app.UseEndpoints 之后,则为时已晚,因为应用程序代码已经执行。

app.UseEndpoints 之前运行的中间件中管理路由白名单是一个想法,但维护起来很麻烦。

那么有没有办法挂接到端点路由,或者框架中的 API 可以让我 "preemptively" 确定路由是否有效?

UseRouting 的调用完成了确定哪个端点将到达 运行 的工作。如果找到匹配项,它会为当前 HttpContext 设置 Endpoint。这可以在使用 HttpContext.GetEndpoint 的中间件组件中使用。下面是一个使用这种方法的例子:

app.UseRouting();

app.Use(async (ctx, next) =>
{
    // using Microsoft.AspNetCore.Http;
    var endpoint = ctx.GetEndpoint();

    if (endpoint != null)
    {
        // An endpoint was matched.
        // ...
    }

    await next();
});

app.UseEndpoints(endpoints => endpoints.MapControllers());