app.UseRouting()和app.UseEndPoints()有什么区别?

时间:2019-09-08 22:13:15

标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-core

在尝试理解它们的过程中,似乎它们都用于将请求路由/映射到某个端点

5 个答案:

答案 0 :(得分:24)

UseRouting :将请求与端点匹配。

UseEndpoints :执行匹配的端点。

它使路由匹配和解析功能与终结点执行功能脱钩,而终结点执行功能迄今都与MVC中间件捆绑在一起。

这使ASP.NET Core框架更加灵活,并允许其他 中间件在 UseRouting UseEndpoints 之间起作用。那允许 这些中间件来利用来自端点路由的信息, 例如,对 UseAuthentication 的调用必须在 UseRouting ,以便路由信息可用于身份验证决策,并且位于 UseEndpoints 之前,以便用户 在访问端点之前已通过身份验证。

答案 1 :(得分:12)

基于dotnet核心的文档:

╔══════════════════════════════════════════╦═══════════════════════════════════════╗
║             app.UseRouting()             ║          app.UseEndPoints()           ║
╠══════════════════════════════════════════╬═══════════════════════════════════════╣
║               Find Endpoint              ║           Execute Endpoint            ║
║                                          ║                                       ║
║  Adds route matching to the middleware   ║  Adds endpoint execution to the       ║
║  pipeline. This middleware looks at the  ║  middleware pipeline.                 ║
║  set of endpoints defined in the app,    ║  It runs the delegate associated      ║
║  and selects the best match based        ║  with the selected endpoint.          ║
║  on the request.                         ║                                       ║
║                                          ║                                       ║
╚══════════════════════════════════════════╩═══════════════════════════════════════╝

根据上表,我们应该注意一些提示:

  1. 如果应用调用 UseStaticFiles ,请将 UseStaticFiles 放在 UseRouting 之前。

  2. 重要的是,将 Authentication Authorization 中间件放在UseRouting和UseEndPoints 之间。

  3. UseRouting()调用之后之后出现的任何中间件都会知道最终将运行哪个端点。

  4. 出现在之前调用 UseRouting()之前的任何中间件都不知道最终将运行哪个端点。

答案 2 :(得分:5)

首先,您可以看看他们的source code

1.UseRouting

public static IApplicationBuilder UseRouting(this IApplicationBuilder builder)
    {
        if (builder == null)
        {
            throw new ArgumentNullException(nameof(builder));
        }

        VerifyRoutingServicesAreRegistered(builder);

        var endpointRouteBuilder = new DefaultEndpointRouteBuilder(builder);
        builder.Properties[EndpointRouteBuilder] = endpointRouteBuilder;

        return builder.UseMiddleware<EndpointRoutingMiddleware>(endpointRouteBuilder);
    }

2.UseEndPoint

public static IApplicationBuilder UseEndpoints(this IApplicationBuilder builder, Action<IEndpointRouteBuilder> configure)
    {
        if (builder == null)
        {
            throw new ArgumentNullException(nameof(builder));
        }

        if (configure == null)
        {
            throw new ArgumentNullException(nameof(configure));
        }

        VerifyRoutingServicesAreRegistered(builder);

        VerifyEndpointRoutingMiddlewareIsRegistered(builder, out var endpointRouteBuilder);

        configure(endpointRouteBuilder);

        // Yes, this mutates an IOptions. We're registering data sources in a global collection which
        // can be used for discovery of endpoints or URL generation.
        //
        // Each middleware gets its own collection of data sources, and all of those data sources also
        // get added to a global collection.
        var routeOptions = builder.ApplicationServices.GetRequiredService<IOptions<RouteOptions>>();
        foreach (var dataSource in endpointRouteBuilder.DataSources)
        {
            routeOptions.Value.EndpointDataSources.Add(dataSource);
        }

        return builder.UseMiddleware<EndpointMiddleware>();
    }

然后参考No overload for method 'UseRouting' takes 1 arguments,其中详细解释了它们之间的区别。

  

ASP.NET Core 3使用完善的终结点路由,通常   提供有关应用程序内路由的更多控制。终点   路由分为两个单独的步骤:

     

第一步,对请求的路由进行再次匹配   路线以找出正在访问的路线。

     

最后一步,   正在评估确定的路由以及相应的中间件,   例如称为MVC。

     

这两个步骤是由app.UseRouting()和app.UseEndpoints()设置的。前者将注册运行逻辑以确定路由的中间件。然后,后者将执行该路由。

另外,请参考

https://asp.net-hacker.rocks/2019/08/12/aspnetcore30-look-into-startup.html https://aregcode.com/blog/2019/dotnetcore-understanding-aspnet-endpoint-routing/

答案 3 :(得分:2)

UseRouting计算应为请求URL路径使用的路由,但此时不在管道中路由。 UseRouting添加了可由后续中间件使用的元数据。

UseEndpoints执行Controller和相应的处理程序。

看看这个有用的文章:https://andrewlock.net/converting-a-terminal-middleware-to-endpoint-routing-in-aspnetcore-3/

答案 4 :(得分:0)

app.UseRouting()

标记中间件管道中做出路由决定或请求与端点匹配的位置。换句话说,端点被选中。

app.UseEndPoints()

标记在中间件管道中执行所选端点的位置。它执行端点。