zoukankan      html  css  js  c++  java
  • WebApi-控制器路由

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

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

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

    1  消息流概览

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

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

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

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

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

    2  消息处理管道

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

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

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

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

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

    return base.SendAsync(request,cancellationToken)

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

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

     分发程序

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

     ApiController.ExecuteAsync方法内部执行。

  • 相关阅读:
    C#设计模式之单例模式(Singleton Pattern)
    ASP.NET MVC Route之WebForm路由与源码分析(二)
    ASP.NET MVC Route之WebForm路由与源码分析(一)
    Autofac初探(一)
    Razor基础语法一
    ASP.NET MVC之视图传参到控制器的几种形式
    LINQ to SQL语句(2)Count/Sum/Min/Max/Avg操作符
    LINQ to SQL语句(1)Select查询的九种形式
    学习《深入理解C#》—— 泛型 (第三章3.1---3.2)
    学习《深入理解C#》—— 委托的构成、合并与删除和总结 (第二章1.1---1.4)
  • 原文地址:https://www.cnblogs.com/createwell/p/12702888.html
Copyright © 2011-2022 走看看