读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;
上一篇:GCD Again


下一篇:silverlight简单数据绑定2