Delphi - 2010 - DataSnap白皮书(10)

2019-08-03 12:42

const GetPlatformName = 'DSAdmin.GetPlatformName'; const GetServerClasses = 'DSAdmin.GetServerClasses'; const GetServerMethods = 'DSAdmin.GetServerMethods';

const GetServerMethodParameters = 'DSAdmin.GetServerMethodParameters'; const DropServerClasses = 'DSAdmin.DropServerClasses'; const DropServerMethods = 'DSAdmin.DropServerMethods';

const GetDatabaseConnectionProperties = 'DSAdmin.GetDatabaseConnectionProperties'; end;

TDSServer组件有五个事件:OnConnect,OnDisconnect,OnError,OnPrepare和OnTrace.我们可以 实现这五个事件来响应不同的情况,例如向日志文件中写入日志.

OnConnect,OnDisconnect,OnError和OnPrepare事件有一个继承于TDSEventObject的参数,包含 了DxContext,传输,服务和DbxConnection组件的属性,在OnConnect和OnDisconnect事件中 TDSConnectEventObject类型还包含了ConnectionProperties和ChannelInfo属性.

TDSConnectEventObject也包括了由错误引起的异常, TDSConnectEventObject还包括了我们要使 用的MethodAlias和ServerClass属性.

OnTrace事件有一个TDBXTraceInfo类型的参数.注意由于这个OnTrace事件处理程序也会包含一 些代码错误,如TDBXTraceInfo和CBRType是编译器未知的.为了解决这个问题,我们需要引用 DBXCommon单元(为识别TDBXTraceInfo类型)和DBComonTypes单元(为识别CBRType类型). 在OnConnect事件处理中,我们可以通过ChannelInfo来查看连接信息,例如(使用自定义的函数 LogInfo向日志文件中写入信息):

procedure TServerContainer1.DSServer1Connect( DSConnectEventObject: TDSConnectEventObject); begin

LogInfo('Connect ' + DSConnectEventObject.ChannelInfo.Info); end;

在OnTrace事件处理程序中我们可以使用TraceInfo.Message中的信息记录服务端正在做什么. function TServerContainer1.DSServer1Trace(TraceInfo: TDBXTraceInfo): CBRType; begin

LogInfo('Trace ' + TraceInfo.CustomCategory); LogInfo(' ' + TraceInfo.Message);

Result := cbrUSEDEF; // take default action end;

注意,在客户端也可以使用连接到TSQLConnection组件的TSQLMonitor组件来跟踪DataSnap服务 端和客户端之间的通讯(在创建这个DataSnap服务的客户端时讲解). 一个跟踪日志输出如下所示:

17:05:55.492 Trace

17:05:55.496 read 136 bytes:{\

{\\17:05:55.499 Prepare

如你所见,TraceInfo.Message中包括了传输信息的字节数和被调用的方法名称等信息. 2.1.1.1.2. TDSSERVERCLASS

TDSServerClass组件将服务端特定的类发布给远程客户端(使用动态方法调用).

TDSServerClass组件有一个Server属性指向TDSServer组件.其他除了Name和Tag外的重要属 性是LifeCycle.默认是Session,但是也可设置为Server或Invocation.从长到短,Server,Session 和Invocation的意思是一个类的实例在服务端的生命周期为整个服务,一个DataSnap会话或一次 方法调用.Session表示每个连接将获取其自己的服务类实例.如果将其改为Invocation,将会得到 一个无状态的服务类—可用于部署CGI Web服务应用程序(其也是无状态的,每个请求都进行加载 卸载).将LifeCycle改为Server,则所有的连接请求使用一个服务类实例.这可以用于计算请求数 量,但是必须自己保证线程安全.

TDSServerClass有四个事件:OnCreateInstance,OnDestroyInstance(当实例创建和注销时触

发).OnGetClass和OnPrepare.OnPrepare事件可用于准备服务方法.使用D2009或使用D2010手动向 容器中添加TDSServerClass时,OnGetClass事件必须由我们自己实现,以便于指定一个可远程调用 的类.在D2010的向导中,已经自动为我们实现了OnGetClass事件,如下: procedure TServerContainer1.DSServerClass1GetClass(

DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass); begin

PersistentClass := ServerMethodsUnitDemo.TServerMethods1; end;

注意:当我们重命名了自动生成的代码单元ServerMethodsUnit1为 ServerContainerUnitDemo.pas后必须修改这里. 2.1.1.1.3. TDSTCPSERVERTRANSPORT

TDSTCPServerTransport组件负责在DataSnap服务端和客户端进行通讯,使用TCP/IP协议. TDSTCPServerTransport组件有五个重要的属性:BufferKBSize,Filters(D2010新特 性),MaxThreads,PoolSize,Port和Server.

BufferKBSize属性指定通讯缓冲区大小,默认设置为32KB.Filters属性可以包含一个传输过滤 器集合,将在第四节讲解.MaxThreads属性定义最大线程数(默认为0不限制).PoolSize可用于连接 池(如果修改了这里,也需要相应的修改DataSnap客户端).

Server属性指向TDSServer组件.TDSTCPServerTransport组件没有事件. 2.1.1.1.4. TDSHTTPSERVICE

TDSHTTPService组件负责使用HTTP协议组织DataSnap服务端和客户端通讯. TDSHTTPService组件有十个属性(除了Name和

Tag):Active,AuthenticationManager,DSHostName,DSPort,Filters,HttpPort,Name,RESTContext,Server,和只读的ServerSoftware属性. Active属性指定DSHTTPService开始侦听请求.可以在设计时设置,但是这会影响DataSnap服务 在运行时启动(由于DSHTTPService组件侦听了同一个端口—在设计时启动侦听,在运行时就不能 再启动一个侦听了).最好的方式在在TServerContainer的OnCreate事件中激活TDSHTTPService: procedure TServerContainer1.DataModuleCreate(Sender: TObject); begin

DSHTTPService1.Active := True; end;

AuthenticationManager属性用于定义处理HTTP验证的管理组件,这里指向了 TDSHTTPServiceAuthenticationManager组件.这个组件在下节详述.

DSHostName和DSPort属性用于定义DataSnap服务端连接,但只有在没有指定Server属性时生效.

通常都是使用Server属性.

Filters属性可以包含一系列传输过滤器,在第四节详述.

HttpPort属性定义DSHTTPService组件侦听的特定端口以响应连接.注意这个属性默认是80端口, 通常在发布时必须做修改(IIS等Web服务已占用了80端口).

RESTContext属性指定REST上下文URL,这样就可以以REST服务的方式调用DataSnap服务.默 认,RESTContext属性设置为rest,我们可以用http://localhost/datasnap/rest/...来调用服务. 在第六节详述REST,JSON和客户端回调函数.

最后,Server属性指向同一个容器中的TDSServer组件.如果没有指定Server属性,也可以使用

DSHostName和DSPort属性连接到使用TCP的DataSnap服务.当设置了Server属性,DSHostName和 DSport属性失效.

TDSHTTPService组件有五个事件:四个是REST相关的,一个是跟踪事件,REST相关事件将在第六 节详述.

OnTrace事件可用于跟踪对DSHTTPService组件的调用,例如:

procedure TServerContainer1.DSHTTPService1Trace(Sender: TObject; AContext: TDSHTTPContext; ARequest: TDSHTTPRequest; AResponse: TDSHTTPResponse); begin

LogInfo('HTTP Trace ' + AContext.ToString); LogInfo(' ' + ARequest.Document); LogInfo(' ' + AResponse.ResponseText); end;

注意HTTP跟踪信息只有当客户端使用HTTP连接到服务端是才会触发(默认使用TCP/IP协议). 跟踪输出如下所示:

17:05:55.398 HTTP Trace TDSHTTPContextIndy 17:05:55.400 /datasnap/tunnel 17:05:55.403 OK

从中可见,AContext设置为TDSHTTPContextIndy,ARequest设置为/DataSnap/tunnel,AResponse 设置为OK.

2.1.1.1.5. TDSHTTPSERVICEAUTHENTICATIONMANAGER

当选中HTTP通讯协议的验证复选框后,TDSHTTPServiceAuthenticationManager组件将自动出现 在服务容器中.也可手动添加到服务容器中,当然TDSHTTPService组件的AuthenticationManager 属性必须指向TDSHTTPServiceAuthenticationManager组件.

TDSHTTPServiceAuthenticationManager组件有一个事件:OnHTTPAuthenticate事件,可以验证 Datasnap客户端到服务端连接的HTTP信息.

procedure TServerContainer1.DSHTTPServiceAuthenticationManager1HTTPAuthenticate( Sender: TObject; const Protocol, Context, User, Password: string; var valid: Boolean); begin

if (User = 'Bob') and (Password = 'Swart') then valid := True else

valid := False end;

当然,你可以使用数据库技术来扩展验证方式.客户端最好使用HTTPS方式将用户名和密码等

HTTP验证信息发送到服务端,所以我希望易博龙可以在现有HTTP和TCP/IP基础上在添加一个HTTPS 协议.

HTTPS可以确保连接安全和数据包加密, 数据包被窃取也不会泄露用户和密码信息.可与你所在

域的ISP或Web管理员协商是否有可能使用HTTPS—--强烈推荐(如我使用的 是https://www.bobswart.hl).

DataSnap服务应用程序另一个优势是可将HTTP验证信息(所用协议和上下文信息)记录下来.以 便于查找谁登陆过,谁试图登录(如做欺骗登录操作试图获取DataSnap服务的权限). 2.1.1.2. SERVERMETHODSUNITDEMO

注意我们已经检查了ServerContainerUnitDemo.pas单元,现在看一下DataSnap服务的另外重要 的单元:ServerMethodsUnitDemo.pas单元.在新建DataSnap服务对话框中我们指定了

TDSServerModule类作为基类,因此TServerMethods1类型继承于TDSServerModule(其继承于

TDSServerModuleBase,又继承于TProvideDataModule,添加一个析构函数和BeforeDestruction过 程. TProvideDataModule继承于正常的TDataModule,增加了服务提供者的能力 更多信息见后 面).

由于TServerMethods1继承于TDataModule,设计时可以看到一个数据模块的可视区域.我们可以 向其中添加一下不可视组件,如数据存取控件等.在第三节将操作数据库,现在保持设计区为空,仅 向TServerMethods1类添加方法.

如果不想向项目组添加其他类型的项目—DataSnap控制台应用程序及DataSnap Windows服务应 用程序,可跳到2.1.4节查看实现服务方法. 2.2. DATASNAP 客户端

第一个DataSnap服务端范例启动并侦听请求,现在创建一个客户端.本节中,我们将讲解如何在 客户端连接服务端,如何导入方法生产服务类.

确信DataSnap服务已启动,我们创建一个DataSnap客户端应用程序项目.为了在设计时方便切换 DataSnap服务项目和DataSnap客户端项目,将客户端项目添加到同一个项目组.任何类型的项目都 可作为DataSnap客户端项目,这里我们选择VCL窗口应用程序,保存为DataSnapClient.dpr,主窗体 为ClientForm.pas.控件栏中DataSnap服务目录中含有六个DataSnap(服务)组件,DataSnap客户端 目录中不含我们现在需要的组件.

DataSnap客户端目录中的组件都是一些老的DataSnap组件,可以使用,但不推荐.但可使用新

的TDSProviderConnect组件,可以在新的DataSnap客户端上连接老的DataSnap服务(3.2中详述). 除了DataSnap客户端目录,我们还要看看dbEpress目录,可以找到一个新的组件叫做

TSQLServerMethod(注意:在下一个截图中这个新组件很容易发现,其用TSql前缀替代了TSQL前 缀).

TSqlServerMethod组件可用于调用DataSnap服务的远程方法,但首先需要连接到DataSnap服务. 可以使用TSQLConnect组件建立连接—--不在使用原来的TXXXConnection组件.为了灵活 性,TSQLConnection组件的Drive属性下拉框中有个新选项:DataSnap.在ClientForm上放置一个 TSQLConnection组件,设置其Driver属性为DataSnap.Driver属性将变成可展开的对象,展开后如 下图:

注意:默认CommunicationProtocol属性为空,TSQLConnection将使用TCP/IP作为通信协议(端口 211).BufferKBSize为32(KB),端口设置为211(与服务端设置相同).实际应用中一般将端口号设置 为其他端口(同时修改服务端客户端),因为211端口是DataSnap默认端口不安全.

HostName,UserName和Password用于连接到DataSnap服务.在本地测试时,将HostName设置为 localhost,通常可以设置为服务器名称,DNS或IP地址.

不要忘记将TSQLConnection的LoginPropt属性设置为False,否则将会在连接的时候弹出登录窗


Delphi - 2010 - DataSnap白皮书(10).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:长方体与正方体的认识评课

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: