WebApi-控制器路由

简介: WebAPI核心任务是什么?它的核心机制又是什么?

带着问题去思考,大家好!

WebAPI核心任务是什么?它的核心机制又是什么?

核心任务是处理HTTP请求并提供适当的响应。

1  消息流概览

HTTP消息流的框架组件大致分2种

  • 依靠HTTP消息获得上下文的组件
  • 依靠高层编程模型获得上下文

第一层组件只依靠来自底层“消息处理程序”管道的核心HTTP消息上下文。

image.png

这张图是消息处理管道和控制器管道。

依赖高层编程模型的组件不同,这些组件可以访问并使用编程框架抽象层。

2  消息处理管道

HttpServer是消息处理管道的入口,HttpServer调用HttpClientFactory的CreatePipeline方法。使用全局和路由配置数据中提供的处理程序,初始化管道。

HttpServer自己派生的DelegatingHandler类,HttpServer成为了消息处理管道中第一个处理程序,其后是认识多个定制的DelegatingHandler对象组成,这些定制对象注册在HttpConfiguration中,接着是HttpRoutingDispatcher,最后要么是HttClientFactory.CreatePipline构造的另一个消息处理管道,要么就是默认的HttpControllerDispatcher

image.png

1:HttpServer将HttpClientFactory.CreatePipeline返回的值赋给自己的InnerHandler属性,成为管道的第一个节点。

2:调用自己的基类SendAsync方法。将控制权移交给下一个处理程序。

管道所有的消息处理都用这种方式移交

returnbase.SendAsync(request,cancellationToken)

3:基类DelegatingHanlder直接调用对象的InnerHandler的SendAsync方法。对象的内部处理程序在自己的SendAsync方法中处理消息。最有一个就是将请求分发到控制器实例的处理程序

image.png

这是基于任务的异步管道。

分发程序

HttpServer使用HttpRoutingDispatcher的一个实例作为消息处理程序管道的最后一个节点。它是负责消息处理管道的最后一个节点,或者默认HttpControllerDispatcher。

HttpControllerDispatcher派生自HttpMessageHandler。HttpMessageHandler无法直接调用。HttpRoutingDispatcher将分发程序实例封装在一个HttpMessageHandler对象中执行。

var invoker=(routeData.Route==null||routeData.Route.Handler==null)?_defaultInvoker:new HttpMessageInvoker(routeData.Route.Handler,disposeHandler:false);return invoker.SendAsync(request,cancellationToken);

HttpControllerDispatcher执行三个任务

  • 使用一个实例IHttpControllerSelector接口对象,选择一个控制器
  • 使用一个实例IHttpControllerActivator接口对象,选择一个控制器的实例。
  • 传入一个控制器上下文,执行控制器实例

ASP.Net Web Api提供一个默认的实现DefaultIHttpControllerSelector,

  • 判断控制器是否可以从路由数据直接发现,使用基于属性的路由时,这一条为真
  • 检查控制器名是否有效,如果控制名缺失或者为空字符串,404.
  • 使用控制器名,在控制器信息缓存中寻找匹配的HttpControllerDescriptor并返回

3  控制器管道

ApiController处理模型。

image.png

ApiController.ExecuteAsync方法内部执行。

相关文章
|
5天前
|
PHP
ThinkPHP6的控制器定义及控制器初使用
本文介绍了ThinkPHP6框架中控制器的定义和初步使用方法。内容包括控制器的文件位置、命名规范、如何改变控制器目录名、单应用模式下的项目访问路径,以及控制器类文件的实际位置和访问URL的示例。文章还提到了ThinkPHP的控制器类可以灵活定义,无需继承任何基础类库,但建议继承一个基础的控制器类以方便扩展。控制器名不区分大小写,并且支持驼峰命名转下划线的方式。
ThinkPHP6的控制器定义及控制器初使用
|
2月前
|
API 开发者
WebApi路由机制详解
在设计路由时,应确保各个路由具有明确的职责分离,并避免冗余和混淆。保持路由的一致性和可预测性可以为API的最终用户带来更好的体验。
15 0
|
4月前
|
JSON API 网络架构
Django REST framework视图集与路由详解:深入理解ViewSet、ModelViewSet与路由映射器
Django REST framework视图集与路由详解:深入理解ViewSet、ModelViewSet与路由映射器
|
12月前
|
Kubernetes 监控 应用服务中间件
【K8S系列】深入解析控制器
【K8S系列】深入解析控制器
176 0
|
负载均衡 前端开发 Java
统一网关Gateway、路由断言工厂、路由过滤器及跨域问题处理
统一网关Gateway、路由断言工厂、路由过滤器及跨域问题处理
237 0
|
PHP
【laravel】@22 资源控制器和资源路由
【laravel】@22 资源控制器和资源路由
87 0
【laravel】@22 资源控制器和资源路由
|
API PHP
【laravel】@6 控制器
【laravel】@6 控制器
109 0
【laravel】@6 控制器
|
缓存 JavaScript 前端开发
【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--控制器和处理函数的注册篇(4/8)【controller+action】
文章目录 前情概要 前边的文章把一些基本的前置任务都完成了。接下就是比较重要的处理函数action是如何自动发现和注册的拉,也就是入口函数RouteHandler(也是我们的第一个express中间件)里面的一些细节。
952 0
|
API
2.C#WebAPI设置路由和参数1
1.当我们创建WebApi的时候我们的项目下的Contorls文件夹下的ValuesController文件下会出现这么几个方法: // GET http://程序ip:程序端口/api/values public IEnumerable Get() { ...
1594 0