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

Chr*_*ris 2 .net c# asp.net-core asp.net-core-3.0

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

我的 API 控制器正在映射为以下内容:

app.UseEndpoints(endpoints => endpoints.MapControllers());
Run Code Online (Sandbox Code Playgroud)

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

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

我最初考虑了一个自定义中间件,但只是意识到,如果我将中间件放置在它之前,app.UseEndpoints它将触发任何和所有请求(将创建大量虚拟实体),即使是那些不路由的请求。

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

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

那么有没有一种方法可以挂钩端点路由,或者框架中的 API 可以让我“抢先”确定路由是否有效?

Kir*_*kin 6

调用的任务UseRouting是确定要运行哪个端点。如果找到匹配项,它将设置Endpoint当前的HttpContext. 这可以在使用 的中间件组件内部使用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());
Run Code Online (Sandbox Code Playgroud)