读DataSnap源代码(六)
具体分析一下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源代码(六)的更多相关文章
- 读DataSnap源代码(一)
Delphi的DataSnap用了一段时间了,但一直感觉有些地方还不够了解,所以花时间阅读了源代码,特作此烂笔头. Datasnap是在之前的WebBorker基础上搭建的,DataSnap向导自动生 ...
- 读DataSnap源代码(五)
function TDSHTTPWebDispatcher.DispatchRequest(Sender: TObject; Request: TWebRequest; Response: TWebR ...
- 读DataSnap源代码(四)
继续篇中的 function TCustomWebDispatcher.DispatchAction(Request: TWebRequest; Response: TWebResponse): Bo ...
- 读DataSnap源代码(三)
function TWebRequestHandler.HandleRequest(Request: TWebRequest; Response: TWebResponse): Boolean; va ...
- 读DataSnap源代码(二)
program Project1; {$APPTYPE GUI} {$R *.dres} uses Vcl.Forms, Web.WebReq, IdHTTPWebBrokerBridge, Form ...
- 读Flask源代码学习Python--config原理
读Flask源代码学习Python--config原理 个人学习笔记,水平有限.如果理解错误的地方,请大家指出来,谢谢!第一次写文章,发现好累--!. 起因 莫名其妙在第一份工作中使用了从来没有接 ...
- session自己定义存储,怎样更好地进行session共享;读tomcat7源代码,org.apache.catalina.session.FileStore可知
session自己定义存储.怎样更好地进行session共享: 读tomcat源代码,org.apache.catalina.session.FileStore可知 一.详见: 方法1 public ...
- dotnet 读 WPF 源代码笔记 布局时 Arrange 如何影响元素渲染坐标
大家是否好奇,在 WPF 里面,对 UIElement 重写 OnRender 方法进行渲染的内容,是如何受到上层容器控件的布局而进行坐标偏移.如有两个放入到 StackPanel 的自定义 UIEl ...
- dotnet 读 WPF 源代码笔记 渲染收集是如何触发
在 WPF 里面,渲染可以从架构上划分为两层.上层是 WPF 框架的 OnRender 之类的函数,作用是收集应用程序渲染的命令.上层将收集到的应用程序绘制渲染的命令传给下层,下层是 WPF 的 GF ...
随机推荐
- C++ API方式连接mysql数据库实现增删改查
这里复制的 http://www.bitscn.com/pdb/mysql/201407/226252.html 一.环境配置 1,装好mysql,新建一个C++控制台工程(从最简单的弄起,这个会了, ...
- 部署php的正确姿势
1. 更新源 apt-get update 2.安装apache apt-get install apache2 ubuntu下apache2虚拟主机配置 cd /etc/apache2/sites- ...
- 小白学习Python遇到的一些2.7与3.X之间的不同问题
1.输入字母出错问题 原本跟着视频一起学习,currency_str_value=input(‘请输入带单位货币金额’) 但是运行的时候,输入数字就没有问题,只要带上了字母就会报错,后来百度,pyth ...
- SQL注入之Sqli-labs系列第十三关(基于单引号POST的报错注入)
开始挑战第十三关(Double Injection- String- with twist) 访问地址,输入报错语句 ' '' ') ") - 等使其报错 分析报错信息 很明显是需要采 ...
- mysql创建表单脚本
如图所示,T_SENSOR_QC_CONFIG_GLOBAL_ITEM表通过外键CATEGORY_ID连接T_SENSOR_QC_CONFIG_CAT表.COMMENT为字段或表单添加注释.
- quartz延迟执行一次
package com.example.balabala; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; impor ...
- 3D 网页,webgl ,threejs 实例
http://learningthreejs.com/blog/2013/04/30/closing-the-gap-between-html-and-webgl/ http://adndevblog ...
- ERROR: gnu-config-native-20150728+gitAUTOINC+b576fa87c1-r0 do_unpack: Function failed: Fetcher failure: Fetch command failed with exit code 128, output: fatal: the '--set-upstream' option is no longer
/********************************************************************** * ERROR: gnu-config-native-2 ...
- CF444(Div. 1简单题解)
A .DZY Loves Physics 题意:给定带点权和边权的无向图,现在让你选一些点,使得 点权和/被选点对间的边权和 最大. 思路:不难证明,选择边和对应的两点是最优的. #include&l ...
- vs2015连接mysql进行数据库操作
要求:电脑提前安装好vs,mysql. 1.在需要连接mysql的项目上右键选择“属性” -> “C/C++” -> “常规” ->选择“附加包含目录” 在弹出窗口中添加mysql的 ...