事件,可以验证
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,否则将会在连接的时候弹出登录窗 口.
一旦TSQLConnection的Driver属性设置好,就可以设置Connected属性为True去连接DataSnap服
务端.注意这时DataSnap服务必须运行才能连接成功. 2.2.1. DATASNAP客户端类
在确定连接正常后,右击TSQLConnection组件,选择Generate DataSnap Class选项,将生成一个
新单元,默认叫做Unit1,含有一个叫做TServerMethods1Client的类(在DataSnap服务方法类名称
后加了一个Client).保存单元为ServerMethodsClient.pas. 这个TServerMethods1Client类如下所示
type
TServerMethods1Client = class private
FDBXConnection: TDBXConnection; FInstanceOwner: Boolean;
FEchoStringCommand: TDBXCommand; FServerTimeCommand: TDBXCommand; public
constructor Create(ADBXConnection: TDBXConnection); overload; constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload; destructor Destroy; override;
function EchoString(Value: string): string; function ServerTime: TDateTime; end;
如你所见,TServerMethods1Client类有两个构造方法,一个析构方法和两个我们在服务端定义 的服务方法.
为使用这些方法,将ServerMethodsClient单元引用到ClientForm,在客户端窗体上放置一个按
钮,在按钮的OnClick事件中写如下代码:
procedure TForm2.Button1Click(Sender: TObject); var
Server: TServerMethods1Client; begin
Server := TServerMethods1Client.Create(SQLConnection1.DBXConnection); try
ShowMessage(DateTimeToStr(Server.ServerTime)) finally Server.Free end; end;
这个代码将创建一个TServerMethods1Client类实例,然后调用ServerTime服务类,最后释放这
个DataSnap服务的代理对象.
点击按钮将弹出对话框显示服务端的时间.
同样方法测试EchoString.
2.2.1.1. HTTP COMMUNICATION PROTOCOL
注意我已经提到TSQLConnection组件以TCP/IP作为默认通讯协议.这样我们就看不到任何HTTP
跟踪信息(在2.1.1.1.4小结中定义).然而,很容易修改通讯协议,仅需在TSQLConnection的Driver
属性中的CommunicationProtocal子属性中输入HTTP即可.注意这是我们还要修改Port属性,因为
211被TCP/IP占用,同时要修改服务端的TDSHTTPService组件的端口号. 修改后运行DataSnap客户端,会出现如下错误:
解决方法是在DataSnap客户端向ClientForm中添加DSHTTPLayer单元引用. 2.2.1.2. HTTP 验证
使用HTTP通讯协议的好处之一是可以使用其包含的HTTP验证.由DataSnap服务端的
TDSHTTPServiceAuthenticationManager组件所支持(详见2.1.1.1.5). 如果实现了OnHTTPAuthenticate事件处理,将会核对HTTP验证.我们必须保证输入正确的信息才
能确保TDSHTTPServiceAuthenticationManager验证通过.否则将会得到一个