读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 ...
随机推荐
- 4-log4j2之切分日志文件
一.添加maven依赖 <dependencies> <dependency> <groupId>org.apache.logging.log4j</grou ...
- 深入了解HyperServer
本文,我们将尝试深入了解uniGUI HyperServer. 可以将HyperServer所有功能分成三类: HyperServer和稳定性 HyperServer和可扩展性 HyperServer ...
- 2016 多校联赛7 Balls and Boxes(概率期望)
Mr. Chopsticks is interested in random phenomena, and he conducts an experiment to study randomness. ...
- web(四)html表单类标签
表单类标签 操作者用于输入信息,并将信息提交给服务器的标签集合. 表单标签介绍 form标签:表单元素(其余标签)标签的容器标签 input标签:用于用户信息输入的标签. button标签:按钮标签. ...
- JAVA面向对象和类
一.构造方法 1.构造方法是一个与类同名的方法,用来对类进行实例化(创建对象) 2.特点 1).构造方法没有返回值: 2).构造方法的名称要与本类的名称相同. 例 public class Test{ ...
- 启发式搜索A-Star算法 【寻找 最短路径 算法】【地理几何位置 可利用的情况】
在处理最短路径问题时,有一种启发式算法是我们应该了解的,由于其有着优秀的探索效率在各自现实项目中多有应用,它就是 A-star 算法,或 A* 算法. 个人观点: A* 算法并不保证找到的路径一 ...
- 双向重定向tee命令详解
vim一般在训练网络的时候需要保存log文件,同时需要在屏幕上网络的输出信息,在shell文件中常常会看到如下代码 执行的命令 2>&1 | tee log.txt tee是linux中 ...
- [LeetCode&Python] Problem 242. Valid Anagram
Given two strings s and t , write a function to determine if t is an anagram of s. Example 1: Input: ...
- 动态规划-----hdu 1024 (区间连续和)
给定一个长度为n的区间:求m段连续子区间的和 最大值(其中m段子区间互不相交) 思路: dp[i][j]: 前j个元素i个连续区间最大值 (重要 a[j]必须在最后一个区间内) 转移方程:dp[i][ ...
- 理解--->Java中的值传递&引用传递
转自:http://url.cn/5tL9F5D 值传递和引用传递 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际 ...