【问题标题】:How can I check if a route is valid in a .NET Core middleware before UseEndpoints does?如何在 UseEndpoints 之前检查路由在 .NET Core 中间件中是否有效?
【发布时间】:2020-04-21 19:59:42
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: c# .net asp.net-core asp.net-core-3.0


    【解决方案1】:

    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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-17
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 2021-02-25
      • 2021-11-14
      • 2019-09-22
      • 1970-01-01
      相关资源
      最近更新 更多