Endpoint是什么?
Endpoint简单的可以理解为这样的一些类,它们包含一个请求的委托(Request Delegate)和其它的一些元数据,使用这些东西,Endpoint类可以生成一个响应。
而在MVC的上下文中,这个请求委托就是一个包装类,它包装了一个方法,这个方法可以实例化一个Controller并执行选中的Action方法。
Endpoint还包含元数据,这些元数据用来决定他们的请求委托是否应该用于当前的请求,还是另有其它用途。
说起来可能有点迷糊,下一篇文章我们看看源码。
Startup.cs
之前我们见过,ASP.NET Core里面的Startup.cs里面有两个方法,分别是ConfigureServices()和Configure(),它们的职责就是注册应用的一些服务和构建中间件请求管道。
而Startup.cs同时也是路由以及Endpoint进行注册的地方,当然是作为其它步骤的一部分。
看图:
在ASP.NET Core应用程序启动的时候,一个叫做ControllerActionEndpointDataSource的类作为应用程序级别的服务被创建了。
这个类里面有一个叫做CreateEndpoints()的方法,它会获取所有Controller的Action方法。
然后针对每个Action方法,它会创建一个Endpoint实例。这些Endpoint的实例就是包装了Controller和Action方法执行的请求委托(Request Delegate)。
同时ControllerActionEndpointDataSource里面包存储着在应用程序里注册的路由模板。
而针对每个Endpoint,它要么与某个按约定的路由模板相关联,要么与某个Controller Action上的Attribute路由信息相关联。而这些路由在稍后就会被用来将Endpoint与进来的请求进行匹配。
从Endpoint的角度查看请求-响应流程图
App启动那部分就不说了。
第一个HTTP请求进来的时候,Endpoint Routing中间件就会把请求映射到一个Endpoint上。它会使用App启动时创建好的EndpointDataSource,用它来遍历查找所有可用的Endpoint,并检查和它关联的路由以及元数据,以便找到最匹配的Endpoint。
一旦某个Endpoint实例被选中,它就会被附加在请求的对象上,这样它就可以被后续的中间件所使用了。
最后在管道的尽头,当 Endpoint中间件运行的时候,它就会执行Endpoint所关联的请求委托。这个请求委托就会触发和实例化选中的Controller和Action方法,并产生响应。最后响应再从中间件管道原路返回。