具体分析一下DataSanp App与Rest, WebBroker App的不同,先看TDSHTTPService。

***********************************************************************************************

TDSHTTPService = class(TCustomDSHTTPServerTransport)

继承体系:

TDSHTTPService -> TCustomDSHTTPServerTransport -> TCustomDSRESTServerTransport -> TDSServerTransport ...

************************************************************************************************

TDSHTTPWebDispatcher = class(TDSHTTPServerTransport, IWebDispatch)

继承体系:

TDSHTTPWebDispatcher -> TDSHTTPServerTransport -> TCustomDSHTTPServerTransport  ...

************************************************************************************************

都是TCustomDSHTTPServerTransport的后代.  目前来看,如果没有意外,后续的请求处理方式应该是一样的。

那么DataSanp App的WEB请求又是从哪开始的呢?

   TCustomDSHTTPServerTransport = class(TCustomDSRESTServerTransport)
strict protected
FHttpServer: TDSHTTPServer;
strict private
{ Private declarations }
FCredentialsPassthrough: Boolean;
FDSAuthPassword: string;
FDSAuthUser: string;
FDSPort: Integer;
FDSHostName: string;
FDSCacheContext: string;
function IsCacheContextStored: Boolean;
private
function GetHttpServer: TDSHTTPServer;
function IsDSHostnameStored: Boolean;
procedure SetCacheContext(const Ctx: string);
function GetCacheContext: string;
protected
function CreateHttpServer: TDSHTTPServer; virtual; abstract;

上面是TCustomDSHTTPServerTransport类的部分定义,可以看到第19行处,有一个abstract的方法,意味着TCustomDSHTTPServerTransport的子类必须实现这个方法 。

 function TDSHTTPService.CreateHttpServer: TDSHTTPServer;
var
LHTTPServer: TDSHTTPServerIndy;
begin
if Assigned(FCertFiles) then
LHTTPServer := TDSHTTPSServerIndy.Create(Self.Server, IPImplementationID)
else
LHTTPServer := TDSHTTPServerIndy.Create(Self.Server, IPImplementationID);
Result := LHTTPServer;
LHTTPServer.HTTPOtherContext := HTTPOtherContext;
end;
 function TDSHTTPWebDispatcher.CreateHttpServer: TDSHTTPServer;
begin
Result := TDSHTTPServerWebBroker.Create;
end;

果然是不一样的,但都是一个父类继承下来的:

TDSHTTPServerIndy= class(TDSHTTPServer)

TDSHTTPServerWebBroker = class(TDSHTTPServer)

   TDSHTTPServerIndy = class(TDSHTTPServer)
strict private
FHTTPOtherContext: TDSHTTPOtherContextEvent;
private
FServer: IIPHTTPServer;
FDefaultPort: Word;
FServerSoftware: string;
FIPImplementationID: string;
FPeerProcs: IIPPeerProcs;
function PeerProcs: IIPPeerProcs;
function GetActive: Boolean;
function GetDefaultPort: Word;
procedure SetActive(const Value: Boolean);
procedure SetDefaultPort(const Value: Word);
procedure DoIndyCommand(AContext: IIPContext;
ARequestInfo: IIPHTTPRequestInfo; AResponseInfo: IIPHTTPResponseInfo);
function GetServerSoftware: string;
procedure SetServerSoftware(const Value: string);
property HTTPOtherContext: TDSHTTPOtherContextEvent read FHTTPOtherContext write FHTTPOtherContext;
protected
function Decode(Data: string): string; override;
procedure DoCommandOtherContext(AContext: TDSHTTPContext;
ARequestInfo: TDSHTTPRequest; AResponseInfo: TDSHTTPResponse;
const ARequest: string); override;
procedure InitializeServer; virtual;
public
constructor Create(const ADSServer: TDSCustomServer; const AIPImplementationID: string = ''); override;
destructor Destroy; override;
property Server: IIPHTTPServer read FServer;
property DefaultPort: Word read GetDefaultPort write SetDefaultPort;
property Active: Boolean read GetActive write SetActive;
property ServerSoftware: string read GetServerSoftware write SetServerSoftware;
end;
 procedure TDSHTTPServerIndy.SetActive(const Value: Boolean);
begin
if Value and (FServer = nil) then
begin
FServer := PeerFactory.CreatePeer(FIPImplementationID, IIPHTTPServer, nil) as IIPHTTPServer;
InitializeServer;
end;
if FServer <> nil then
FServer.Active := Value;
end;

读DataSnap源代码(六)的更多相关文章

  1. 读DataSnap源代码(一)

    Delphi的DataSnap用了一段时间了,但一直感觉有些地方还不够了解,所以花时间阅读了源代码,特作此烂笔头. Datasnap是在之前的WebBorker基础上搭建的,DataSnap向导自动生 ...

  2. 读DataSnap源代码(五)

    function TDSHTTPWebDispatcher.DispatchRequest(Sender: TObject; Request: TWebRequest; Response: TWebR ...

  3. 读DataSnap源代码(四)

    继续篇中的 function TCustomWebDispatcher.DispatchAction(Request: TWebRequest; Response: TWebResponse): Bo ...

  4. 读DataSnap源代码(三)

    function TWebRequestHandler.HandleRequest(Request: TWebRequest; Response: TWebResponse): Boolean; va ...

  5. 读DataSnap源代码(二)

    program Project1; {$APPTYPE GUI} {$R *.dres} uses Vcl.Forms, Web.WebReq, IdHTTPWebBrokerBridge, Form ...

  6. 读Flask源代码学习Python--config原理

    读Flask源代码学习Python--config原理 个人学习笔记,水平有限.如果理解错误的地方,请大家指出来,谢谢!第一次写文章,发现好累--!. 起因   莫名其妙在第一份工作中使用了从来没有接 ...

  7. session自己定义存储,怎样更好地进行session共享;读tomcat7源代码,org.apache.catalina.session.FileStore可知

    session自己定义存储.怎样更好地进行session共享: 读tomcat源代码,org.apache.catalina.session.FileStore可知 一.详见: 方法1 public ...

  8. dotnet 读 WPF 源代码笔记 布局时 Arrange 如何影响元素渲染坐标

    大家是否好奇,在 WPF 里面,对 UIElement 重写 OnRender 方法进行渲染的内容,是如何受到上层容器控件的布局而进行坐标偏移.如有两个放入到 StackPanel 的自定义 UIEl ...

  9. dotnet 读 WPF 源代码笔记 渲染收集是如何触发

    在 WPF 里面,渲染可以从架构上划分为两层.上层是 WPF 框架的 OnRender 之类的函数,作用是收集应用程序渲染的命令.上层将收集到的应用程序绘制渲染的命令传给下层,下层是 WPF 的 GF ...

随机推荐

  1. 记一次ios加急上架经历

    https://developer.apple.com//contact/app-store/?topic=expedite app迭代版本上架之前一直好好的没报错,没crash,但是有一次加急上架, ...

  2. 什么是wsgi,uwsgi,uWSGI

    WSGI: web服务器网关接口,是一套协议.用于接收用户请求将请求进行初次封装,然后将请求交给web框架 实现wsgi协议的模块: 1,wsgiref,本质就是编写一个socket服务端,用于接收用 ...

  3. 用Java批量重命名文件

    要事先在C盘里创建“照片”和“照片1”两个文件夹 1import java.io.*; public class Jack { public static void main(String[] arg ...

  4. 2017第八届蓝桥杯C/C++ B组省赛-等差素数列

    标题:等差素数列 2,3,5,7,11,13,....是素数序列. 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列公差为30,长度为6. 200 ...

  5. perror strerror使用方法

    1. 简介 很多系统函数在错误返回时将错误原因记录在libc定义的全局变量errno中,每种错误原因对应一个错误码. errno在头文件errno.h中声明,是一个整型变量,所有错误码都是正整数.然后 ...

  6. Power BI与Tableau基于Google搜索上的比较

    在数据分析领域里,不少的数据爱好者都会关心什么数据分析产品最好用?最重要的是,很多的企业也特别希望员工能真正知道如何使用这些BI平台以确保公司的投资是值得.同类的文章,小悦也曾发布过,可参考最近< ...

  7. mysql 批量kill

    select concat('kill ',id,';') t  from information_schema.processlist  order by t

  8. 【02_258】Add Digits

    Add Digits Total Accepted: 49702 Total Submissions: 104483 Difficulty: Easy Given a non-negative int ...

  9. Gym.101908 Brazil Subregional Programming Contest(寒假自训第六场)

    这几天睡眠时间都不太够,室友晚上太会折腾了,感觉有点累,所以昨天的题解也没写,看晚上能不能补起来. B . Marbles 题意:给定N组数(xi,yi),玩家轮流操作,每次玩家可以选择其中一组对其操 ...

  10. LeetCode - Number of Distinct Islands

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...