Web API中的路由。
路由机制会把一个请求的URL映射到一个Controller上面的Action。这一点很关键。也就说你发送一个Http请求,MVC框架会解析这个请求的URL,之后尝试把它去映射到一个Controller的Action上。
在ASP.NET CORE 3.0中,有两个路由中间件。中间件理解为http请求会穿越这些使用的配置。
在Startup的Configure中。
app.UseRouting(); 这个中间件的作用是标记路由决策在请求管道里发生的位置,即选择端点。
app.UseEndpoints();这个中间件的作用是标记选择好的端点在请求管道什么地方来执行。
路由有两种方式进行设置,基于属性更加适合Web API。
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
上面的代码仅仅映射了Controller没有使用任何约定。
这里就需要使用属性和URL模板了。
属性:例如[Route],[HttpGet],[HttpPost],我喜欢放在Action上面。
URL模板:结合属性就可以把请求正确的映射到Controller的Action上面。
补充Endpoints(以下引用杨旭老师 草根专栏 讲的非常清楚了)
Endpoint是什么?
Endpoint理解为一些类 它包装一个方法可以实现实例化一个Controller并执行选中的Action方法。
在Endpoint Routing 路由系统里,其实一共有两个中间件。
1.Endpoint Routing 中间件。它决定了在程序中注册的哪个Endpoint应该用来处理请求。
2.Endpoint 中间件。它是用来执行选中的Endpoint,从而让其生成响应的。
Endpoint Routing的流程图大致如下
以上仍然不清楚可以看整个响应的流程图
这个类里面有一个叫做CreateEndpoints()的方法,它会获取所有Controller的Action方法。
然后针对每个Action方法,它会创建一个Endpoint实例。这些Endpoint的实例就是包装了Controller和Action方法执行的请求委托(Request Delegate)。
同时ControllerActionEndpointDataSource里面包存储着在应用程序里注册的路由模板。
而针对每个Endpoint,它要么与某个按约定的路由模板相关联,要么与某个Controller Action上的Attribute路由信息相关联。而这些路由在稍后就会被用来将Endpoint与进来的请求进行匹配。
第一个HTTP请求进来的时候,Endpoint Routing中间件就会把请求映射到一个Endpoint上。它会使用App启动时创建好的EndpointDataSource,用它来遍历查找所有可用的Endpoint,并检查和它关联的路由以及元数据,以便找到最匹配的Endpoint。
一旦某个Endpoint实例被选中,它就会被附加在请求的对象上,这样它就可以被后续的中间件所使用了。
最后在管道的尽头,当 Endpoint中间件运行的时候,它就会执行Endpoint所关联的请求委托。这个请求委托就会触发和实例化选中的Controller和Action方法,并产生响应。最后响应再从中间件管道原路返回。