欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WebApi-控制器路由

程序员文章站 2022-06-19 23:43:12
带着问题去思考,大家好! WebAPI核心任务是什么?它的核心机制又是什么? 核心任务是处理HTTP请求并提供适当的响应。 1 消息流概览 HTTP消息流的框架组件大致分2种 依靠HTTP消息获得上下文的组件 依靠高层编程模型获得上下文 第一层组件只依靠来自底层“消息处理程序”管道的核心HTTP消息 ......

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

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

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

1  消息流概览

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

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

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

WebApi-控制器路由

 

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

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

2  消息处理管道

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

httpserver自己派生的delegatinghandler类,httpserver成为了消息处理管道中第一个处理程序,其后是认识多个定制的delegatinghandler对象组成,这些定制对象注册在httpconfiguration中,接着是httproutingdispatcher,最后要么是httclientfactory.createpipline构造的另一个消息处理管道,要么就是默认的httpcontrollerdispatcher

WebApi-控制器路由

 1:httpserver将httpclientfactory.createpipeline返回的值赋给自己的innerhandler属性,成为管道的第一个节点。

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

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

return base.sendasync(request,cancellationtoken)

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

WebApi-控制器路由

 

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

 分发程序

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处理模型。

WebApi-控制器路由

 

 apicontroller.executeasync方法内部执行。