《Delphi2010DataSnap白皮书1》由会员分享,可在线阅读,更多相关《Delphi2010DataSnap白皮书1(61页珍藏版)》请在金锄头文库上搜索。
1、Delphi 2010 DataSnap 白皮书 12010-04-07 11:25在这个白页中我们将讲解 Delphi2010 DataSnap 架构新的特性和功能.1. DATASNAP 历史作为 MIDAS 起始于 Delphi3,Delphi4 是 MIDAS II,Delphi5 中是 MIDASIII,而后基于 COM 远程数据模块方式使用 TCP/IP,HTTP,(D)COM 构建出强大的通讯能力.从 Delphi6 开始改名为DataSnap,直到 D2007 这个框架一直在使用.D2009 重新架构了 DataSnap移除 COM 依赖,使用 TCP/IP 以更轻量级的方式生
2、成远程服务对象和客户端连接能力.同时提供了与 Delphi Prism2009 开发的.NET 程序通讯的功能.Delphi2010 中构建于 D2009 架构之上,并对此架构做了进一步的扩展,包括使用两个向导来创建新的部署目标(VCL 窗体,Window 服务,控制台及面向 Web 的 ISAPI,CGI 或 Web App Debugger).HTTP(S)传输协议,HTTP 验证,客户端回调函数,REST 和 JSON 的支持,及使用过滤器来支持压缩和解压缩.1.1 DATASNAP 范例数据位置本白页中我建议您使用 Demo 和范例来学习.虽然 Delphi 支持很多数据库系统,使用
3、DBX4,ADO dbGo,或其他数据存取技术,为了演示方便我这里使用 DBX4 来操作 BlackfishSQL 的employee.jds 数据库.见 C:Documents and SettingsAll UsersDocumentsRAD Studio7.0DemosdatabasedatabasesBlackfishSQLemployee.jds.在截图中可以看到我使用的是 Windows Vista 或 Win7 操作系统,使用 Windows Server 2008 Web 编辑器来部署 DataSnap ISAPI 服务.2. DATASNAP 目标:如何获取数据DataSna
4、p2010 支持三种不同的 Windows 方式:VCL 窗体,Windows 服务和控制台应用程序.本节中我们将讨论他们的好处,不同和每种方式最适合在什么情况下使用.下面会创建一个 DataSnap 服务端和客户端,我们将讲解TDSServer,TDSServerClass,TDSTCPServerTransport,TDSHTTPService,TDSHTTPWebDispatcher 和TDSHTTPServiceAuthenticationManager 组件,以及自定义的服务方法和TDSServerModule 类.将讨论不同的传输协议(TCP,HTTP)的好处及传输效率.并讨论 D
5、ataSnap 服务对象的不同生命期选项(Server,Session,Invocation),及他们的效率和使用的建议.最后,讨论部署.2.1. DATASNAP 服务端范例在 Object Repository 中有两个不同的 DataSnap 服务向导:一个是生成基于Windows 的 Datasnap 服务项目,一个是生成基于 WebBroker 的 DataSnap 服务项目(需要部署到 IIS 或Apache).我们将会演示.启动了 Delphi2010,点击 File.New.Other,你会在 Object Repository 中看到DataSnap 服务向导中显示的三个图标
6、:DataSnap Server,DataSnap WebBroker Server,和 Server Module.双击第一个(后面的两个在下面的小结中讲解),弹出如下对话框:界面中第一部分是控制项目类型的.默认可以生成可视化的带有主窗体的 VCL 窗体应用程序.第二个选项是创建控制台应用程序,生成一个控制台窗口可以用来输出请求应答信息(用 Writeln 语句输出服务应用程序正在做什么).这两种方式都是为了做范例或最初部署,很少用于最终部署.由于DataSnap 架构不再基于 COM,客户端将不能使服务端启动.因此为了响应客户端的请求,DataSnap 服务端应该一直在运行.如果你希望应用
7、 7X24 小时全天候运行,DataSnap 服务端必须同时也在运行中.对应VCL 窗体或控制台应用程序,需要一个账户登录到 Windows 中后才能启动DataSnap 服务,背离了这种要求.第三者选择在这时最适合:一个 Windows 服务应用程序,安装后配置成为自动启动,当计算机启动后将自动运行(不需要账户登录).服务应用程序不会弹出界面,很难调试 Bug.然而,为了整合这三种的优势,我将用几分钟创建一个项目组,包括 VCL 窗体应用程序的 DataSnap 服务,控制台 DataSnap 服务,及Windows 服务 Datasnap 服务,都共享同一个自定义的服务方法,这样就可以开发
8、一个 Datasnap 服务应用程序,在需要的时候编译出三个不同类型的部署方式.第二部分是选择使用的 Datasnap 服务的通讯协议.和 DanaSnap2009 相比,我们可以看到多了一个HTTP 通讯,及 HTTP 验证.为了更加灵活,这里建议选择全部选项,我们可以同时使用 TCP/IP,HTTP,及使用 HTTP 引入的 HTTP 验证.第三部分已经为我们配置好了,如果我们要提供一个服务方法类,我们可以选择它的基类:TPersistent,TDataModule 或 TDSServerModule.推荐使用最后的一个选项,可使用 RTTI 来启动执行函数 (也可能你觉得使用 TData
9、Module 更合适不操作数据库,或不使用其他非可视控件,这时使用TPersitent 也够用了).现在是从 DSServer.pas 中贴出来的一小段代码,来说明 TDSServerModule 和TProviderDataModule(也是继承于 TDataModule)之间的关系.TDSServerModuleBase = class(TProviderDataModule)publicprocedure BeforeDestruction; override;destructor Destroy; override;end;$MethodInfo ONTDSServerModule =
10、 class(TDSServerModuleBase)end;$MethodInfo OFF当无法确定时就使用 TDSServerModule 选项作为基类.2.1.1. 创建多目标项目组- VCL 窗体项目如上面所说,这里创建多目标的 Datasnap 服务项目组.首先创建一个 VCL 窗体应用程序作为 Datasnap服务,选择所有的通讯协议.默认创建了一个叫做 Project1.dproj 的项目,并带有三个单元文件,ServerContainerUnit1.pas,ServerMethodUnit1.pas 和 Unit1.pas.首先File.Save Project As 保存项目
11、,并输入有实际意义的文件名称.将 Unit1.pas 保存为MainForm.pas,ServerMethodsUnit1.pas保存为 ServerMethodsUnitDemo.pas 文件,保存 Project1.dproj 为DataSnapServer.dproj.稍后我们将向项目组添加控制台应用程序和 Window 服务应用程序.首先我们来检查一下项目,并编译工程.如果你编译 DataSnapServer 项目,将会出现一个错误信息(由于我们将ServerMethodsUnit1.pas 改名所致).错误原因是由于ServerContainerUnitDemo.pas 单元中的Im
12、plementation 部分引用了 ServerMethodsUnit1.pas 单元.为了修复这个冲突,修改引用单元的文件名称,从新编译.这是发现在第 37 行出现错误,使用了 ServerMethodsUnit1 中的TServerMethods1 类型.修改 ServerMethodsUnit1 为 ServerMethodsUnitDemo.这时可以正确的编译项目了.ServerContainerUnitDemo 的引用部分应该向下面代码所示:implementationusesWindows, ServerMethodsUnitDemo;$R *.dfmprocedure TSer
13、verContainer1.DSServerClass1GetClass(DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass);beginPersistentClass := ServerMethodsUnitDemo.TServerMethods1;end;end.2.1.1.1. SERVERCONTAINERUNITDEMO打开 ServerContainerUnitDemo 单元,将会看到不少于五个组件:一个TDSServer,一个TDSServerClass,一个 TDSTCPServerTrans
14、port(用于 TCP/IP 通讯),一个TDSHTTPService(用于 HTTP通讯),一个 TDSHTTPServiceAuthenticationManager 组件(用于 HTTP 验证).前面两个一直会存在,其他的三个则是根据选择的通讯协议生成的.2.1.1.1.1. TDSSERVERTDSServer 组件只有四个属性,AutoStart,HideDSAdmin,Name 和 Tag.AutoStart属性默认设置为True,意味着在窗体创建后自动启动 DataSnap 服务.如果将 AutoStart 设置为False,需要手动调用Start 方法启动服务,并调用 Stop
15、 方法停止服务.可以调用 Started 方法验证DataSnap 服务是否已经启动.HideAdmin 属性默认设置为 False.如果设置为 True,连接到 DataSnap 服务的客户端将无法调用Datasnap 服务中的 TDSAdmin 类的内置方法.TDSAdmin 不是一个真正的类,我们可以调用的 TDSAdmin方法定义在 DSNames 单元:TDSAdminMethods = classpublicconst CreateServerClasses = DSAdmin.CreateServerClasses;const CreateServerMethods = DSAd
16、min.CreateServerMethods;const FindClasses = DSAdmin.FindClasses;const FindMethods = DSAdmin.FindMethods;const FindPackages = DSAdmin.FindPackages;const GetPlatformName = DSAdmin.GetPlatformName;const GetServerClasses = DSAdmin.GetServerClasses;const GetServerMethods = DSAdmin.GetServerMethods;const GetServerMethodParameters = DSAdmin.GetServerMethodParameters;const DropServerClasses = DSAdmin.DropServerClasses;const DropServerMet