ASP.Net Core 中 IApplicationBuilder 的 Map 方法和 IEndpointRouteBuilder 的 Map 方法有什么区别

问题描述 投票:0回答:2

由于

WebApplication
实现了
IApplicationBuilder
IEndpointRouteBuilder
,因此有一个
Map
方法用于具有多个重载的应用程序,特别是
Map(string pattern,Action<IApplicationBuilder>)
Map(string pattern, RequestDelegate requestDelegate)
。他们有什么区别?

asp.net-core web-applications routes endpoint
2个回答
2
投票

虽然你们有相同的名字,但它们的目的和过载几乎不同。应用程序构建器

(Map(string pattern,Action<IApplicationBuilder>))
的map方法首先使用
IApplicationBuilder.New()
方法创建一个新应用程序,然后将使用
Action<IApplicationBuilder>
配置在Map方法中定义的配置应用于这个新应用程序。最后,它使用 New IApplication 的 Build 方法并创建一个请求委托。然后使用匹配的路径作为基本路径并将剩余路径作为名为
MapMiddleware
的中间件中的路径来调用此委托(除了设置和重置基本路径以及从传递的路径到匹配的路径并反向!并调用构建的请求委托之外,它什么都没有)。 请参阅以下链接:

IApplicationBuilder 地图

但是

IEndpointRouteBuilder
的 Map 方法(
Map(string/RoutePattern pattern, RequestDelegate requestDelegate))
首先创建一个新的
RouteEndpointBuilder()
,其中
order=0
displayname
作为来自模式和委托的模式原始文本。然后添加
RequestDelegate
的属性(如果有)(基于类)向构建器请求委托(如控制器)。然后检查
EndpointDataSource
是否存在
IEndpointRouteBuilder
,如果没有则创建一个(例如使用新的
ModelEndpointDataSource()
)并将其添加到
IEndpointRouteBuilder.DataSources
。最后构建来自
IEndpointConventionBuilder
RouteEndPointBuilder
例如使用
new DefaultEndpointConventionBuilder(endpointBuilder)
并将其连接到数据源(实际上,它应该构建路由端点并将其连接到数据源,但我们可以以从约定构建器读取的方式实现端点的 getter)最后返回该约定构建器以对其进行更多工作。请参阅以下内容:

IEndpointRouteBuilder 映射方法


0
投票

主要区别:

  • IApplicationBuilder.Map
    分支基于 url 的 start,而
    IEndpointRouteBuilder.Map
    分支基于 full url
  • IEndpointRouteBuilder.Map
    处理程序始终是terminal,而
    IApplicationBuilder.Map
    允许通过调用
    next.Invoke()
  • 进一步执行管道
© www.soinside.com 2019 - 2024. All rights reserved.