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方法内部执行。

相关文章
|
消息中间件 物联网 网络性能优化
MQTT常见问题之mqtt 连接一直显示 Not authorized to connect如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
SQL 监控 测试技术
搭建Jaeger
搭建Jaeger
245 0
|
存储 Kubernetes 监控
基于Kubernetes的电商平台部署:实现高可用、弹性伸缩与容器化管理
基于Kubernetes的电商平台部署:实现高可用、弹性伸缩与容器化管理
|
数据采集 机器人 测试技术
SeleniumBase在无头模式下绕过验证码的完整指南
本文详细介绍了如何在SeleniumBase的无头模式下绕过验证码,通过使用代理IP(以爬虫代理为例)、设置User-Agent和Cookie等手段提升爬虫效率。文章首先分析了无头模式下面临的验证码挑战,然后提供了具体的策略和代码示例,包括浏览器设置、代理IP配置及模拟用户行为的方法。最后,通过一个访问大众点评网站并绕过验证码的完整代码示例,展示了如何在实际场景中应用这些技术,应对现代网站的反爬虫机制。此外,还提供了一些提高爬虫效率的实用技巧,如代理池轮换、设置合适延迟和分布式爬虫等。
1472 1
|
存储 JSON 分布式计算
HDFS教程(05)- HDFS磁盘均衡
HDFS教程(05)- HDFS磁盘均衡
544 0
|
消息中间件 Prometheus 监控
统一观测|Prometheus 监测 RocketMQ
RocketMQ 如何接入 PrometheusRocketMQ 诞生于阿里内部的核心电商系统,是业务消息的首选 MQ 平台。上图是 RocketMQ 5.0 的系统全貌,在接入层、核心组件和底层运维方面做了非常大的改进,具有功能多样、高性能、高可靠、可观测、易运维等众多优势。Metrics、Tra...
468 1
统一观测|Prometheus 监测 RocketMQ
|
机器学习/深度学习 传感器 算法
指数分布优化算法Exponential distribution optimizer(EDO)附matlab代码
指数分布优化算法Exponential distribution optimizer(EDO)附matlab代码
|
前端开发 JavaScript API
浏览器原理 19 # JavaScript 引擎是如何实现 async / await 以同步的方式来编写异步代码的?
浏览器原理 19 # JavaScript 引擎是如何实现 async / await 以同步的方式来编写异步代码的?
319 0
浏览器原理 19 # JavaScript 引擎是如何实现 async / await 以同步的方式来编写异步代码的?
|
存储 索引
LeetCode 381. Insert Delete GetRandom O1 Dallowed
设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构。
193 0
LeetCode 381. Insert Delete GetRandom O1 Dallowed
|
Java Spring
Spring之Bean生命周期源码分析(一)2
Spring之Bean生命周期源码分析(一)
274 0