Web Api(3)

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方法,并产生响应。最后响应再从中间件管道原路返回。

原文地址:https://www.cnblogs.com/cdjbolg/p/12057200.html