'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