在尝试理解它们的过程中,似乎它们都用于将请求路由/映射到某个端点
答案 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. ║ ║
║ ║ ║
╚══════════════════════════════════════════╩═══════════════════════════════════════╝
根据上表,我们应该注意一些提示:
如果应用调用 UseStaticFiles ,请将 UseStaticFiles 放在 UseRouting 之前。
重要的是,将 Authentication 和 Authorization 中间件放在UseRouting和UseEndPoints 之间。
在 UseRouting()调用之后之后出现的任何中间件都会知道最终将运行哪个端点。
出现在之前调用 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()
标记在中间件管道中执行所选端点的位置。它执行端点。